combobox:将文本和值添加到项目(无绑定源)

在C#WinApp中,如何将文本和值都添加到我的combobox的项目? 我做了一个search,通常的答案是使用“绑定到源”..但在我的情况下,我没有一个绑定源在我的程序准备…我怎么能这样做:

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

您必须创build自己的类types并重写ToString()方法以返回所需的文本。 以下是您可以使用的一个类的简单示例:

 public class ComboboxItem { public string Text { get; set; } public object Value { get; set; } public override string ToString() { return Text; } } 

以下是其用法的一个简单示例:

 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; 

你可以使用这样的匿名类:

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

更新:虽然上面的代码将正确显示在combobox中,您将无法使用ComboBox SelectedValueSelectedText属性。 为了能够使用这些,绑定combobox如下:

 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; 

这是刚才想到的方法之一:

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

而要更改项目的文本或值,可以这样做:

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

Windows窗体中没有称为ListItem的类。 它只存在于ASP.NET中 ,因此在使用它之前,您需要编写自己的类,就像@Adam Markowitz在答案中所做的一样。

另外检查这些页面,他们可能会帮助:

  • 如何将项目添加到combobox

  • 如何:从Windows窗体combobox,列表框或CheckedListBox控件添加和删除项目

不知道这是否适用于原帖中的情况(不用担心这是两年后的事实),但是这个例子适用于我:

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

要重新读取您的值,您必须将SelectedItem属性转换为DictionaryEntry对象,然后可以评估其中的Key和Value属性。 例如:

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

您应该使用dynamic对象在运行时parsingcombobox项目。

 comboBox.DisplayMember = "Text"; comboBox.ValueMember = "Value"; comboBox.Items.Add(new { Text = "Text", Value = "Value" }); (comboBox.SelectedItem as dynamic).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); 

您可以使用Dictionary对象,而不是创build自定义类来添加组合Combobox文本和值。

Dictionary对象中添加键和值:

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

将源Dictionary对象绑定到Combobox

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

检索密钥和值:

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

完整源代码:combobox文本和值

裙带

使用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(); 

我喜欢fab的答案,但不想为我的情况使用字典,所以我replace了元组列表。

 // 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; 

你可以使用一个genericstypes:

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

使用简单的int型的例子:

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

您可以使用此代码combox添加项目与文本和它的价值

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

如果有人对此仍然感兴趣,下面是一个简单而灵活的类,其中包含文本和任何types的值(与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; } } 

使用<T>比将object声明为object更好,因为使用object ,必须跟踪用于每个项目的types,并将其转换为代码以正确使用它。

我已经在我的项目上使用了很长一段时间了。 这真的很方便。

除了Adam Markowitz的回答,下面是一个通用的方式,(相对)简单地将combobox的ItemSource值设置为enums ,同时向用户显示“Description”属性。 (你会认为每个人都希望这样做,这将是一个.NET的class轮,但它不是,这是我find的最优雅的方式)。

首先,创build这个简单的类来将任何Enum值转换成一个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; } } 

其次,在你的OnLoad事件处理程序中,你需要将你的combobox的源设置为基于Enumtypes中的每个EnumComboEnumItems列表。 这可以通过Linq来实现。 然后只需设置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"; } 

现在用户将从用户友好的Descriptions列表中进行select,但是他们select的是您可以在代码中使用的enum值。 要访问用户在代码中的select, comboBoxUserReadable.SelectedItem将是ComboEnumItemcomboBoxUserReadable.SelectedValue将是EMyEnum

我有同样的问题,我所做的只是添加一个新的ComboBox ,只有在同一个索引,然后第一个值,然后当我改变主要组合索引在第二个同时改变,然后我把第二个组合的价值和使用它。

这是代码:

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

类创build:

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

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

这是Visual Studio 2013如何做到的:

单个项目:

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

多个项目:

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

没有必要做类覆盖或包括其他任何东西。 是的comboBox1->SelectedItemcomboBox1->SelectedIndex调用仍然工作。

这与其他一些答案类似,但是是紧凑的,并且如果你已经有一个列表,就避免了转换成字典。

给定一个Windows窗体上的组合ComboBox “combobox”和types属性为Name的类SomeClass

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

这意味着SelectedItem是listSomeClass对象,并且combobox每个项目都将使用其名称显示。

如果需要的话,这是一个非常简单的Windows窗体解决scheme,它是一个(string)的最终值。 项目的名称将显示在combobox上,并可以轻松地比较所选值。

 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; 

并在事件处理程序上获取所选值的值(string)

 string test = testComboBox.SelectedValue.ToString();