ComboBox.ValueMember 和 DisplayMember
Posted
技术标签:
【中文标题】ComboBox.ValueMember 和 DisplayMember【英文标题】:ComboBox.ValueMember and DisplayMember 【发布时间】:2012-03-20 06:55:06 【问题描述】:如何设置这些值?我有一个包含我想在组合框中设置的所有数据的 DataTable,但我找不到如何设置它。
我试过了
ComboBox1.DataSource = dataTable;
ComboBox1.ValueMember = "id"; // --> once hes here, he just jumps out the method
ComboBox1.DisplayMember = "name";
没有编译错误,警告,什么都没有..只是跳出来!
这是填充数据表的查询
"Select * from \"Table\""
我用调试器检查过,数据表已填满。列名称是“id”和“name”。组合框为空白。我是第一次填!
【问题讨论】:
不,我错了……是“id”和“name”。不好意思 【参考方案1】:您不应按此顺序设置列表框和/或组合框的datasource
ComboBox1.DataSource = dataTable;
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
相反,这是正确的顺序:
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
ComboBox1.DataSource = dataTable;
注意:设置datasource
应该是最后一行。
如果您首先设置datasource
,SelectedIndexChanged
事件将触发,您可能会收到转换错误或其他异常。
【讨论】:
没有意义;如果您不首先给组合框提供数据源,那么如果它首先没有数据,它怎么知道ValueMember
应该是什么,DisplayMember
应该是什么。这是一种违反直觉的做法。
@John 你是对的,这是违反直觉的,但它确实有效。搜索组合框数据行视图,您会看到其他遇到同样问题的人。
@John 如果您查看它的内部工作原理,您会明白最后设置 Datasource 对性能至关重要。因为设置ValueMember
不会触发任何操作。如果您先设置 Datasource,cbo 将为您绑定 value 成员。然后,您将设置新的 ValueMember [您想要的] 并且 cbo 将不得不重新绑定绑定。因此,如果您最后设置 DS,则绑定只会发生一次。【参考方案2】:
使用键值对填充组合框
填充组合框的一种巧妙方法是将数据源设置为键值对列表。它还可能激发使用存储在某种列表中的数据:
//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();
该技术可以扩展为多个列列表的更多属性名称。
【讨论】:
这应该是答案;它与枚举作为数据源完美配合:Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().Select(e => new Key = e, Value = e ).ToList();
【参考方案3】:
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.DataBind();这不存在。至少在我的版本(Visual Studio 2010)ComboBox.DataBindings 中没有。并且不是一种方法。 DataBind() 仅适用于 Web 应用程序;如果是 Windows 应用程序,则不需要该行【参考方案4】:他们用字符串...
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
【讨论】:
嗯,不!它不起作用。你看,dataTable 里面有值,因为我用调试器检查过,那些列的名称正是 id 和 name。如果我像你那样说的话,id 会列在组合框中,出于某种原因,idk cuz 名称中有名称。而且它永远不会到达显示线。 我认为 dataTable 不是一个有效的来源,我在 DataSource 中看到了它,但我没有那个:/,也许我可以将 DataTable 解析为 DataSource?【参考方案5】:我也遇到了同样的问题。在我的情况下, 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);
它对我有用。 =)
【讨论】:
这是一个危险的黑客攻击。您可以使用Try
... Finally
块来确保始终重新打开事件。您也可以像其他答案一样将 DataSource 设置为最后。【参考方案6】:
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 :)
【讨论】:
它对我有用!谢谢。你能告诉我更多关于 .ColumnsName 属性和 datatable.Columns 的信息【参考方案7】: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.
【讨论】:
你的答案应该包含对你的代码的解释和它如何解决问题的描述。【参考方案8】:你可以这样指定
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
【讨论】:
以上是关于ComboBox.ValueMember 和 DisplayMember的主要内容,如果未能解决你的问题,请参考以下文章