ComboBox: ajout de texte et de valeur à un élément (pas de source de liaison)

Dans C # WinApp, comment puis-je append du texte et de la valeur aux éléments de mon ComboBox? J’ai fait une recherche et généralement les réponses utilisent “Liaison à une source” .. mais dans mon cas, je n’ai pas de source de liaison prête dans mon programme … Comment puis-je faire quelque chose comme ceci:

combo1.Item[1] = "DisplayText"; combo1.Item[1].Value = "useful Value" 

Vous devez créer votre propre type de classe et remplacer la méthode ToSsortingng () pour renvoyer le texte souhaité. Voici un exemple simple d’une classe que vous pouvez utiliser:

 public class ComboboxItem { public ssortingng Text { get; set; } public object Value { get; set; } public override ssortingng ToSsortingng() { return Text; } } 

Voici un exemple simple d’utilisation:

 private void Test() { ComboboxItem item = new ComboboxItem(); item.Text = "Item text1"; item.Value = 12; comboBox1.Items.Add(item); comboBox1.SelectedIndex = 0; MessageBox.Show((comboBox1.SelectedItem as ComboboxItem).Value.ToSsortingng()); } 
 // Bind combobox to dictionary Dictionarytest = new Dictionary(); test.Add("1", "dfdfdf"); test.Add("2", "dfdfdf"); test.Add("3", "dfdfdf"); comboBox1.DataSource = new BindingSource(test, null); comboBox1.DisplayMember = "Value"; comboBox1.ValueMember = "Key"; // Get combobox selection (in handler) ssortingng value = ((KeyValuePair)comboBox1.SelectedItem).Value; 

Vous pouvez utiliser un cours anonyme comme celui-ci:

 comboBox.DisplayMember = "Text"; comboBox.ValueMember = "Value"; comboBox.Items.Add(new { Text = "report A", Value = "reportA" }); comboBox.Items.Add(new { Text = "report B", Value = "reportB" }); comboBox.Items.Add(new { Text = "report C", Value = "reportC" }); comboBox.Items.Add(new { Text = "report D", Value = "reportD" }); comboBox.Items.Add(new { Text = "report E", Value = "reportE" }); 

MISE À JOUR: Bien que le code ci-dessus s’affiche correctement dans la zone de liste déroulante, vous ne pourrez pas utiliser les propriétés SelectedValue ou SelectedText de ComboBox . Pour pouvoir les utiliser, liez la combo comme ci-dessous:

 comboBox.DisplayMember = "Text"; comboBox.ValueMember = "Value"; var items = new[] { new { Text = "report A", Value = "reportA" }, new { Text = "report B", Value = "reportB" }, new { Text = "report C", Value = "reportC" }, new { Text = "report D", Value = "reportD" }, new { Text = "report E", Value = "reportE" } }; comboBox.DataSource = items; 

Vous devez utiliser dynamic object dynamic pour résoudre l’élément de liste déroulante au moment de l’exécution.

 comboBox.DisplayMember = "Text"; comboBox.ValueMember = "Value"; comboBox.Items.Add(new { Text = "Text", Value = "Value" }); (comboBox.SelectedItem as dynamic).Value 

C’est l’une des façons qui me vient à l’esprit:

combo1.Items.Add(new ListItem("Text", "Value"))

Et pour changer le texte ou la valeur d’un élément, vous pouvez le faire comme ceci:

 combo1.Items[0].Text = 'new Text'; combo1.Items[0].Value = 'new Value'; 

Il n’y a pas de classe appelée ListItem dans Windows Forms . Il n’existe que dans ASP.NET , vous devrez donc écrire votre propre classe avant de l’utiliser, comme l’a fait @Adam Markowitz dans sa réponse .

Consultez également ces pages, elles peuvent vous aider:

  • Comment append un article à une liste déroulante

  • Comment: append et supprimer des éléments d’un contrôle ComboBox, ListBox ou CheckedListBox Windows Forms

Je ne sais pas si cela fonctionnera pour la situation donnée dans le message original (peu importe le fait que ce soit deux ans plus tard), mais cet exemple fonctionne pour moi:

 Hashtable htImageTypes = new Hashtable(); htImageTypes.Add("JPEG", "*.jpg"); htImageTypes.Add("GIF", "*.gif"); htImageTypes.Add("BMP", "*.bmp"); foreach (DictionaryEntry ImageType in htImageTypes) { cmbImageType.Items.Add(ImageType); } cmbImageType.DisplayMember = "key"; cmbImageType.ValueMember = "value"; 

Pour lire votre valeur, vous devez convertir la propriété SelectedItem en object DictionaryEntry, puis évaluer les propriétés Key et Value. Par exemple:

 DictionaryEntry deImgType = (DictionaryEntry)cmbImageType.SelectedItem; MessageBox.Show(deImgType.Key + ": " + deImgType.Value); 

Vous pouvez utiliser Objet Dictionary au lieu de créer une classe personnalisée pour append du texte et de la valeur dans une zone de liste Combobox .

Ajoutez des clés et des valeurs dans un object Dictionary :

 Dictionary comboSource = new Dictionary(); comboSource.Add("1", "Sunday"); comboSource.Add("2", "Monday"); 

Liez l’object Dictionnaire source à Combobox :

 comboBox1.DataSource = new BindingSource(comboSource, null); comboBox1.DisplayMember = "Value"; comboBox1.ValueMember = "Key"; 

Récupérer la clé et la valeur:

 ssortingng key = ((KeyValuePair)comboBox1.SelectedItem).Key; ssortingng value = ((KeyValuePair)comboBox1.SelectedItem).Value; 

Source complète: Combobox Text nd Value

 //set comboBox1.DisplayMember = "Value"; //to add comboBox1.Items.Add(new KeyValuePair("2", "This text is displayed")); //to access the 'tag' property ssortingng tag = ((KeyValuePair< string, string >)comboBox1.SelectedItem).Key; MessageBox.Show(tag); 

J’ai aimé la réponse de fab mais je ne voulais pas utiliser un dictionnaire pour ma situation, j’ai donc substitué une liste de tuples.

 // set up your data public static List> List = new List> { new Tuple("Item1", "Item2") } // bind to the combo box comboBox.DataSource = new BindingSource(List, null); comboBox.ValueMember = "Item1"; comboBox.DisplayMember = "Item2"; //Get selected value ssortingng value = ((Tuple)queryList.SelectedItem).Item1; 

Un exemple utilisant DataTable:

 DataTable dtblDataSource = new DataTable(); dtblDataSource.Columns.Add("DisplayMember"); dtblDataSource.Columns.Add("ValueMember"); dtblDataSource.Columns.Add("AdditionalInfo"); dtblDataSource.Rows.Add("Item 1", 1, "something useful 1"); dtblDataSource.Rows.Add("Item 2", 2, "something useful 2"); dtblDataSource.Rows.Add("Item 3", 3, "something useful 3"); combo1.Items.Clear(); combo1.DataSource = dtblDataSource; combo1.DisplayMember = "DisplayMember"; combo1.ValueMember = "ValueMember"; //Get additional info foreach (DataRowView drv in combo1.Items) { ssortingng strAdditionalInfo = drv["AdditionalInfo"].ToSsortingng(); } //Get additional info for selected item ssortingng strAdditionalInfo = (combo1.SelectedItem as DataRowView)["AdditionalInfo"].ToSsortingng(); //Get selected value ssortingng strSelectedValue = combo1.SelectedValue.ToSsortingng(); 

Vous pouvez utiliser ce code combox add item avec du texte et sa valeur

  private void ComboBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e) { combox.Items.Insert(0, "Copenhagen"); combox.Items.Insert(1, "Tokyo"); combox.Items.Insert(2, "Japan"); combox.Items.Insert(0, "India"); } 

Si quelqu’un est toujours intéressé par cela, voici une classe simple et flexible pour un élément de liste déroulante avec un texte et une valeur de tout type (très similaire à l’exemple d’Adam Markowitz):

 public class ComboBoxItem { public ssortingng Name; public T value = default(T); public ComboBoxItem(ssortingng Name, T value) { this.Name = Name; this.value = value; } public override ssortingng ToSsortingng() { return Name; } } 

Utiliser le est préférable à la déclaration de la value en tant object , car avec l’ object vous devez alors garder une trace du type que vous avez utilisé pour chaque élément et le transposer dans votre code pour l’utiliser correctement.

Je l’utilise sur mes projets depuis un bon moment maintenant. C’est vraiment pratique.

Vous pouvez utiliser un type générique:

 public class ComboBoxItem { private ssortingng Text { get; set; } public T Value { get; set; } public override ssortingng ToSsortingng() { return Text; } public ComboBoxItem(ssortingng text, T value) { Text = text; Value = value; } } 

Exemple d’utilisation d’un int-Type simple:

 private void Fill(ComboBox comboBox) { comboBox.Items.Clear(); object[] list = { new ComboBoxItem("Architekt", 1), new ComboBoxItem("Bauträger", 2), new ComboBoxItem("Fachbesortingeb/Installateur", 3), new ComboBoxItem("GC-Haus", 5), new ComboBoxItem("Ingenieur-/Planungsbüro", 9), new ComboBoxItem("Wowi", 17), new ComboBoxItem("Endverbraucher", 19) }; comboBox.Items.AddRange(list); } 

À la suite de la réponse d’Adam Markowitz, voici un moyen général de (relativement) simplement définir les valeurs ItemSource d’une liste déroulante comme enums , tout en affichant l’atsortingbut “Description” à l’utilisateur. (On pourrait penser que tout le monde voudrait faire ça pour qu’il s’agisse d’une ligne .NET one, mais ce n’est pas le cas, et c’est la manière la plus élégante que j’ai trouvée).

Tout d’abord, créez cette classe simple pour convertir toute valeur Enum en un élément ComboBox:

 public class ComboEnumItem { public ssortingng Text { get; set; } public object Value { get; set; } public ComboEnumItem(Enum originalEnum) { this.Value = originalEnum; this.Text = this.ToSsortingng(); } public ssortingng ToSsortingng() { FieldInfo field = Value.GetType().GetField(Value.ToSsortingng()); DescriptionAtsortingbute atsortingbute = Atsortingbute.GetCustomAtsortingbute(field, typeof(DescriptionAtsortingbute)) as DescriptionAtsortingbute; return atsortingbute == null ? Value.ToSsortingng() : atsortingbute.Description; } } 

Deuxièmement, dans votre gestionnaire d’événement OnLoad , vous devez définir la source de votre liste déroulante comme une liste de ComboEnumItems basée sur chaque Enum de votre type Enum . Cela peut être réalisé avec Linq. Ensuite, définissez simplement DisplayMemberPath :

  void OnLoad(object sender, RoutedEventArgs e) { comboBoxUserReadable.ItemsSource = Enum.GetValues(typeof(EMyEnum)) .Cast() .Select(v => new ComboEnumItem(v)) .ToList(); comboBoxUserReadable.DisplayMemberPath = "Text"; comboBoxUserReadable.SelectedValuePath= "Value"; } 

Maintenant, l’utilisateur choisira dans une liste de vos Descriptions conviviales, mais ce qu’il sélectionnera sera la valeur enum que vous pouvez utiliser dans le code. Pour accéder à la sélection de l’utilisateur dans le code, comboBoxUserReadable.SelectedItem sera ComboEnumItem et comboBoxUserReadable.SelectedValue sera EMyEnum .

J’ai eu le même problème, ce que j’ai fait a été d’append un nouveau ComboBox avec juste la valeur dans le même index que le premier, et puis quand je change le combo principal l’index dans le deuxième changement en même temps, alors je prends la valeur du deuxième combo et l’utiliser.

Ceci est le code:

 public Form1() { eventos = cliente.GetEventsTypes(usuario); foreach (EventNo no in eventos) { cboEventos.Items.Add(no.eventno.ToSsortingng() + "--" +no.description.ToSsortingng()); cboEventos2.Items.Add(no.eventno.ToSsortingng()); } } private void lista_SelectedIndexChanged(object sender, EventArgs e) { lista2.Items.Add(lista.SelectedItem.ToSsortingng()); } private void cboEventos_SelectedIndexChanged(object sender, EventArgs e) { cboEventos2.SelectedIndex = cboEventos.SelectedIndex; } 

Classe creat:

 namespace WindowsFormsApplication1 { class select { public ssortingng Text { get; set; } public ssortingng Value { get; set; } } } 

Codes Form1:

 namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); List 

Voici comment Visual Studio 2013 le fait:

Un seul article:

 comboBox1->Items->AddRange(gcnew cli::array< System::Object^ >(1) { L"Combo Item 1" }); 

Articles multiples:

 comboBox1->Items->AddRange(gcnew cli::array< System::Object^ >(3) { L"Combo Item 1", L"Combo Item 2", L"Combo Item 3" }); 

Pas besoin de faire des remplacements de classe ou d’inclure autre chose. Et oui, les comboBox1->SelectedItem et comboBox1->SelectedIndex fonctionnent toujours.

Ceci est similaire à certaines des autres réponses, mais est compact et évite la conversion en dictionnaire si vous avez déjà une liste.

Étant donné un ComboBox “combobox” sur un formulaire Windows et une classe SomeClass avec la propriété de type de ssortingng Name ,

 List list = new List(); combobox.DisplayMember = "Name"; combobox.DataSource = list; 

Ce qui signifie que SelectedItem est un object SomeClass de la list et que chaque élément de la combobox sera affiché avec son nom.

Ceci est une solution très simple pour les formulaires Windows si tout ce qui est nécessaire est la valeur finale en tant que (chaîne). Les noms des éléments seront affichés dans la zone de liste déroulante et la valeur sélectionnée pourra être facilement comparée.

 List items = new List(); // populate list with test ssortingngs for (int i = 0; i < 100; i++) items.Add(i.ToString()); // set data source testComboBox.DataSource = items; 

et sur le gestionnaire d'événements obtenir la valeur (chaîne) de la valeur sélectionnée

 ssortingng test = testComboBox.SelectedValue.ToSsortingng(); 

Meilleure solution ici

 Dictionary userListDictionary = new Dictionary(); foreach (var user in users) { userListDictionary.Add(user.Id,user.Name); } cmbUser.DataSource = new BindingSource(userListDictionary, null); cmbUser.DisplayMember = "Value"; cmbUser.ValueMember = "Key"; 

Récupérer des données

 MessageBox.Show(cmbUser.SelectedValue.ToSsortingng());