C# ComboBox.ValueMember和DisplayMember
如何设置此值?我有一个DataTable,里面有我想在combobox中设置的所有数据,但是我找不到如何设置它 我试过了C# ComboBox.ValueMember和DisplayMember,c#,postgresql,combobox,datatable,C#,Postgresql,Combobox,Datatable,如何设置此值?我有一个DataTable,里面有我想在combobox中设置的所有数据,但是我找不到如何设置它 我试过了 ComboBox1.DataSource = dataTable; ComboBox1.ValueMember = "id"; // --> once hes here, he just jumps out the method ComboBox1.DisplayMember = "name"; 没有编译错误、警告,什么也没有。。跳出来 这是填充数据表的查询 "Sel
ComboBox1.DataSource = dataTable;
ComboBox1.ValueMember = "id"; // --> once hes here, he just jumps out the method
ComboBox1.DisplayMember = "name";
没有编译错误、警告,什么也没有。。跳出来
这是填充数据表的查询
"Select * from \"Table\""
我使用调试器进行了检查,数据表已填充。列名称为“id”和“name”。组合框为空。这是我第一次装 他们拿着绳子
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
你可以这样指定
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
您不应按此顺序设置列表框和/或组合框的
数据源
ComboBox1.DataSource = dataTable;
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
相反,这是正确的顺序:
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
ComboBox1.DataSource = dataTable;
注意:设置datasource
应该是最后一行
如果先设置datasource
,SelectedIndexChanged
事件将触发,您可能会遇到强制转换错误或其他异常。我也遇到了同样的问题。在我的例子中,SelectedIndexChanged事件触发并跳出该方法。尝试不使用SelectedIndexChanged事件。或者像这样:
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.SelectedIndexChanged -= new System.EventHandler(ComboBox1_SelectedIndexChanged);
ComboBox1.DataSource = dataTable;
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
ComboBox1.SelectedIndexChanged += new System.EventHandler(ComboBox1_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];
该技术可以扩展为多个列列表的更多属性名称 ComboBox1.ValueMember=dataTable.Columns[“id”].ColumnsName;//值不可见的列名
ComboBox1.DisplayMember=dataTable.Columns[“name”].ColumnsName;
/*
需要按属性选择项的列名:
ComboBox1.SelectedItem;
或者,您可以轻松地使用此选项:
ComboBox1.文本;
*/
ComboBox1.DataSource=dataTable//包含数据的数据表
//这应该是最后一个:)
mmm,不!它不起作用。你们看,dataTable中有值,因为我用debbuger检查过,那个些列名就是id和name。如果我像u一样放置它,id会列在组合框中,因为某些原因idk cuz名称中有名称。它从来没有到达displaymamber行。我认为dataTable不是有效的源,我在DataSource中看到过它,但我没有:/,也许我可以将dataTable解析为数据源?不,我错了。。。上面写着“id”和“姓名”。研究Combobox1.DataBind();这是不存在的。至少不在我的版本(visual studio 2010)ComboBox.DataBindings中。DataBind()仅适用于Web应用程序;如果它是一个windows应用程序,那么这行代码就不需要了。你的答案应该包含对你的代码的解释和它如何解决问题的描述。没有意义;如果您不先给组合框提供数据源,它如何知道什么应该是ValueMember
,如果它首先没有数据,那么DisplayMember
应该是什么。这是一种违反直觉的做法。@John你说得对,这是违反直觉的,但它是有效的。搜索combobox datarowview,您会看到其他人也有同样的问题。@John如果您查看它的内部工作方式,您就会明白将Datasource设置为last对性能至关重要。因为设置ValueMember
不会触发任何操作。若您首先设置数据源,cbo将为您绑定值成员。然后,您将设置新的ValueMember[您想要的那个],cbo将不得不重新连接绑定。所以,如果您最后设置DS,绑定只会发生一次。这对我很有效!非常感谢。你能告诉我更多关于.ColumnsName属性和datatable.columns的信息吗?这是一种危险的黑客行为。您可以使用试试Finally
block以确保事件始终重新打开。您还可以像其他答案一样将数据源设置为最后一个。
//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();