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"
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());
}
// 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;
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;
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
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:
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
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);
//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);
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
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;
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();
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.
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
.
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);
}
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();
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());
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;
}
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.
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);
}
}
}
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 string
Name
,
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.