如何设置这个值?我有一个数据表,其中包含我想要在组合框中设置的所有数据,但我找不到如何设置它。
我试过了
ComboBox1.DataSource = dataTable;
ComboBox1.ValueMember = "id"; // --> once hes here, he just jumps out the method
ComboBox1.DisplayMember = "name";
没有编译错误,警告,什么都没有..只是跳出来!
这是填充数据表的查询
"Select * from \"Table\""
我用调试器检查,数据表已填满。列名称是“id”和“name”。组合框为空。我是第一次填写!
您不应该按此顺序设置列表框和/或组合框的
datasource
ComboBox1.DataSource = dataTable;
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
相反,这是正确的顺序:
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
ComboBox1.DataSource = dataTable;
注意:设置
datasource
应该是最后一行。
如果您先设置
datasource
,SelectedIndexChanged
事件将触发,您可能会收到转换错误或其他异常。
使用键值对填充组合框
填充组合框的一个巧妙方法是将数据源设置为键值对列表。它还可能会激发使用存储在某种列表中的数据:
//Some values to show in combobox
string[] ports= new string[3] {"COM1", "COM2", "COM3"};
//Set datasource to string array converted to list of keyvaluepairs
combobox.Datasource = ports.Select(p => new KeyValuePair<string, string>(p, p)).ToList();
//Configure the combo control
combobox.DisplayMember = "Key";
combobox.ValueMember = "Value";
combobox.SelectedValue = ports[0];
也可以使用以下语法填充数据源:
ports.Select(p => new { Key = p, Value = p }).ToList();
该技术可以通过多列列表的更多属性名称进行扩展。
字典项等已经是键值对的对象可以直接使用
combobox.DataSource = new Dictionary<int, string>()
{
{0, "COM1"},
{1, "COM2"},
{2, "COM3"},
}.ToList();
combobox.ValueMember = "Key";
combobox.DisplayMember = "Value";
元组可以这样初始化和使用
var ports= new List<Tuple<int, string>>()
{
Tuple.Create(0, "COM1"),
Tuple.Create(1, "COM2"),
Tuple.Create(2, "COM3")
};
combobox.DataSource = ports;
combobox.ValueMember = "Item1";
combobox.DisplayMember = "Item2";
ComboBox1.DataSource= dt; //the data table which contains data
ComboBox1.ValueMember = "id"; // column name which you want in SelectedValue
ComboBox1.DisplayMember = "name"; // column name that you need to display as text
他们拿着绳子...
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
我也有同样的烦恼。在我的例子中,SelectedIndexChanged 事件触发并且只是跳出该方法。尝试不要使用 SelectedIndexChanged 事件。或者类似这样的东西:
ComboBox1.SelectedIndexChanged -= new System.EventHandler(ComboBox1_SelectedIndexChanged);
ComboBox1.DataSource = dataTable;
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
ComboBox1.SelectedIndexChanged += new System.EventHandler(ComboBox1_SelectedIndexChanged);
这对我有用。 =)
ComboBox1.ValueMember = dataTable.Columns["id"].ColumnsName; // column name which the values are not visible
ComboBox1.DisplayMember = dataTable.Columns ["name"].ColumnsName;
/*
column name that you need to select item by proprity :
ComboBox1.SelectedItem;
Or you can use easly this :
ComboBox1.Text;
*/
ComboBox1.DataSource= dataTable; //the data table which contains data
// and this should be last :)
public class ComboDeger {
private string yazi;
private int deger;
public ComboDeger(string stryazi, int strdeger) {
this.yazi = stryazi;
this.deger = strdeger;
}
public string yazisi {
get {
return yazi;
}
}
public int degeri {
get {
return deger;
}
}
}
private void combobox_doldur() {
ArrayList ComboDegerleri = new ArrayList();
ComboDegerleri.Add(new ComboDeger("9 : NORMAL", 9));
ComboDegerleri.Add(new ComboDeger("10 : ENGELLİ", 10));
comboBox1.DataSource = ComboDegerleri;
comboBox1.DisplayMember = "yazisi";
comboBox1.ValueMember = "degeri";
}
private void Form3_Load(object sender, EventArgs e) {
con.Open();
combobox_doldur();
// Populate the COMBOBOX using an array as DataSource.
}
你可以这样指定
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
也许不完全是所描述的问题,但在我的例子中,类型名称显示在 ComboBox 中,而不是 DisplayValue 中,尽管一切似乎都已正确连接。结果发现,类型的公共属性被定义为没有getter和setter! :)
通过组合给定的示例并添加组合框中的选择:
private void Combobox_SelectedIndexChanged(object? sender, EventArgs e)
{
string colorIdx = ((ComboBox)sender).SelectedValue.ToString();
string colorName = ((System.Tuple<int, string>)((ComboBox)sender).SelectedItem).Item2;
}
private void AddItemsToComboBox()
{
var myItems = new List<Tuple<int, string>>()
{
Tuple.Create(0, "Black"),
Tuple.Create(1, "White"),
Tuple.Create(2, "Red")
};
combobox.DataSource = myItems;
combobox.ValueMember = "Item1";
combobox.DisplayMember = "Item2";
}