web-dev-qa-db-fra.com

ComboBox: Ajout de texte et de valeur à un élément (aucune source de liaison)

Dans C # WinApp, comment puis-je ajouter à la fois Texte et Valeur aux éléments de ma ComboBox? source prête dans mon programme .... Comment puis-je faire quelque chose comme ceci:

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

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

public class ComboboxItem
{
    public string Text { get; set; }
    public object Value { get; set; }

    public override string ToString()
    {
        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.ToString());
}
324
Adam Markowitz
// Bind combobox to dictionary
Dictionary<string, string>test = new Dictionary<string, string>();
        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)
string value = ((KeyValuePair<string, string>)comboBox1.SelectedItem).Value;
176
fab

Vous pouvez utiliser une classe anonyme comme ceci:

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" });

UPDATE: Bien que le code ci-dessus s'affiche correctement dans la liste déroulante, vous ne pourrez pas utiliser les propriétés SelectedValue ou SelectedText de ComboBox. Pour pouvoir les utiliser, associez la liste déroulante 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;
106
buhtla

Vous devez utiliser l'objet dynamic pour résoudre un é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
22
Mert Cingoz

C’est l’une des façons qui me viennent à 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 aurez donc besoin d'écrire votre propre classe avant de l'utiliser, comme l'a fait @Adam Markowitz dans sa réponse .

Consultez également ces pages, elles peuvent aider:

14
Amr Elgarhy

Vous pouvez utiliser Dictionary Object au lieu de créer une classe personnalisée pour ajouter du texte et une valeur dans Combobox.

Ajouter des clés et des valeurs dans un objet Dictionary:

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

Liez l'objet Dictionary source à Combobox:

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

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

string key = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Key;
string value = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Value;

Source complète: Combobox Text nd Value

12
cronynaval

Je ne sais pas si cela fonctionnera pour la situation donnée dans le message d'origine (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 relire votre valeur, vous devez convertir la propriété SelectedItem en un objet DictionaryEntry, puis évaluer les propriétés Key et Value de cet objet. Par exemple:

DictionaryEntry deImgType = (DictionaryEntry)cmbImageType.SelectedItem;
MessageBox.Show(deImgType.Key + ": " + deImgType.Value);
11
Charles Glisan
//set 
comboBox1.DisplayMember = "Value"; 
//to add 
comboBox1.Items.Add(new KeyValuePair("2", "This text is displayed")); 
//to access the 'tag' property 
string tag = ((KeyValuePair< string, string >)comboBox1.SelectedItem).Key; 
MessageBox.Show(tag);
6
Ryan

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");
            
           
        }

insérer quelques éléments dans combox avec le texte et la valeur . et voici son code xaml pour combox

4
Muhammad Ahmad

J'ai aimé la réponse de fab mais je ne voulais pas utiliser de dictionnaire pour ma situation alors j'ai substitué une liste de n-uplets.

// set up your data
public static List<Tuple<string, string>> List = new List<Tuple<string, string>>
{
  new Tuple<string, string>("Item1", "Item2")
}

// bind to the combo box
comboBox.DataSource = new BindingSource(List, null);
comboBox.ValueMember = "Item1";
comboBox.DisplayMember = "Item2";

//Get selected value
string value = ((Tuple<string, string>)queryList.SelectedItem).Item1;
4
Maggie

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)
   {
         string strAdditionalInfo = drv["AdditionalInfo"].ToString();
   }

   //Get additional info for selected item
    string strAdditionalInfo = (combo1.SelectedItem as DataRowView)["AdditionalInfo"].ToString();

   //Get selected value
   string strSelectedValue = combo1.SelectedValue.ToString();
3
Soenhay

Si cela vous intéresse toujours, 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 semblable à l'exemple d'Adam Markowitz):

public class ComboBoxItem<T>
{
    public string Name;
    public T value = default(T);

    public ComboBoxItem(string Name, T value)
    {
        this.Name = Name;
        this.value = value;
    }

    public override string ToString()
    {
        return Name;
    }
}

Utiliser le <T> vaut mieux que de déclarer la value en tant que object, car avec object, vous devrez alors garder une trace du type que vous avez utilisé pour chaque élément et le transtyper dans votre code pour l'utiliser correctement.

Je l'utilise depuis longtemps sur mes projets. C'est vraiment pratique.

3
Matheus Rocha

En complément de la réponse d'Adam Markowitz, voici un moyen générique de définir (relativement) simplement les valeurs ItemSource d'une liste déroulante sur enums, tout en affichant l'attribut «Description» à l'utilisateur. (On pourrait penser que tout le monde voudrait faire cela pour qu'il s'agisse d'un .NET one liner, mais ce n'est tout simplement pas le cas, et c'est la manière la plus élégante que j'ai trouvée).

Commencez par créer cette classe simple pour convertir toute valeur Enum en élément ComboBox:

public class ComboEnumItem {
    public string Text { get; set; }
    public object Value { get; set; }

    public ComboEnumItem(Enum originalEnum)
    {
        this.Value = originalEnum;
        this.Text = this.ToString();
    }

    public string ToString()
    {
        FieldInfo field = Value.GetType().GetField(Value.ToString());
        DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
        return attribute == null ? Value.ToString() : attribute.Description;
    }
}

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

    void OnLoad(object sender, RoutedEventArgs e)
    {
        comboBoxUserReadable.ItemsSource = Enum.GetValues(typeof(EMyEnum))
                        .Cast<EMyEnum>()
                        .Select(v => new ComboEnumItem(v))
                        .ToList();

        comboBoxUserReadable.DisplayMemberPath = "Text";
        comboBoxUserReadable.SelectedValuePath= "Value";
    }

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

1
Bill Pascoe

Vous pouvez utiliser un type générique:

public class ComboBoxItem<T>
{
    private string Text { get; set; }
    public T Value { get; set; }

    public override string ToString()
    {
        return Text;
    }

    public ComboBoxItem(string text, T value)
    {
        Text = text;
        Value = value;
    }
}

Exemple d'utilisation d'un type int simple:

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

        comboBox.Items.AddRange(list);
    }
1
Jan Staecker

C'est une solution très simple pour les formulaires Windows si tout ce dont vous avez besoin est la valeur finale sous forme de (chaîne). Les noms des éléments seront affichés dans la liste déroulante et la valeur sélectionnée peut être facilement comparée. 

List<string> items = new List<string>();

// populate list with test strings
for (int i = 0; i < 100; i++)
            items.Add(i.ToString());

// set data source
testComboBox.DataSource = items;

et sur le gestionnaire d'événement, récupère la valeur (chaîne) de la valeur sélectionnée

string test = testComboBox.SelectedValue.ToString();
0
Esteban Verbel

Meilleure solution ici;

Dictionary<int, string> userListDictionary = new Dictionary<int, string>();
        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.ToString());
0
Orhan Bayram

J'ai eu le même problème, ce que j'ai fait était d'ajouter une nouvelle ComboBox avec juste la valeur dans le même index puis le premier, valeur de la deuxième combo et l'utiliser.

C'est le code:

public Form1()
{
    eventos = cliente.GetEventsTypes(usuario);

    foreach (EventNo no in eventos)
    {
        cboEventos.Items.Add(no.eventno.ToString() + "--" +no.description.ToString());
        cboEventos2.Items.Add(no.eventno.ToString());
    }
}

private void lista_SelectedIndexChanged(object sender, EventArgs e)
{
    lista2.Items.Add(lista.SelectedItem.ToString());
}

private void cboEventos_SelectedIndexChanged(object sender, EventArgs e)
{
    cboEventos2.SelectedIndex = cboEventos.SelectedIndex;
}
0
Miguel

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 substitutions de classe ou d'inclure autre chose. Et oui, les appels comboBox1->SelectedItem et comboBox1->SelectedIndex fonctionnent toujours.

0
Enigma

Classe cré:

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

Codes Form1:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            List<select> sl = new List<select>();
            sl.Add(new select() { Text = "", Value = "" });
            sl.Add(new select() { Text = "AAA", Value = "aa" });
            sl.Add(new select() { Text = "BBB", Value = "bb" });
            comboBox1.DataSource = sl;
            comboBox1.DisplayMember = "Text";
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

            select sl1 = comboBox1.SelectedItem as select;
            t1.Text = Convert.ToString(sl1.Value);

        }

    }
}
0
Limitless isa

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

Étant donné une "variable" ComboBox sur un formulaire Windows et une classe SomeClass avec la propriété de type stringName,

List<SomeClass> list = new List<SomeClass>();

combobox.DisplayMember = "Name";
combobox.DataSource = list;

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

0
Alex Smith