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 应该是最后一行。

如果您首先设置datasourceSelectedIndexChanged 事件将触发,您可能会收到转换错误或其他异常。

【讨论】:

没有意义;如果您不首先给组合框提供数据源,那么如果它首先没有数据,它怎么知道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&lt;SomeEnum&gt;().Select(e =&gt; 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的主要内容,如果未能解决你的问题,请参考以下文章

datatable绑定comboBox,在下拉菜单中显示对应数据

控件联动地区表数据结构

C# WinForm Combobox 赋值

ToolStripComboBox 绑定数据

C#如何获取comboBox所选的文本内容

C#中 combox控件已绑定数据, 如何根据一个string类型字段 设置combox的选择项