ComboBox.ValueMember和DisplayMember

dbn*_*urt 5 c# postgresql datatable combobox

我该如何设置这个值?我有一个DataTable,包含我想在组合框中设置的所有数据,但我无法找到如何设置它.

我试过了

ComboBox1.DataSource = dataTable;
ComboBox1.ValueMember = "id"; // --> once hes here, he just jumps out the method
ComboBox1.DisplayMember = "name";
Run Code Online (Sandbox Code Playgroud)

没有编译错误,警告,没有..只是跳出来!

这是填充DataTable的查询

"Select * from \"Table\""
Run Code Online (Sandbox Code Playgroud)

我检查了调试器并填充了数据表.列名称是"id"和"name".ComboBox是空白的.我第一次填写它!

小智 23

您不应datasource按此顺序设置列表框和/或组合框

ComboBox1.DataSource = dataTable;

ComboBox1.ValueMember = "id"; 

ComboBox1.DisplayMember = "name";
Run Code Online (Sandbox Code Playgroud)

相反,这是正确的顺序:

ComboBox1.ValueMember = "id"; 

ComboBox1.DisplayMember = "name";

ComboBox1.DataSource = dataTable;
Run Code Online (Sandbox Code Playgroud)

注意:设置datasource应该是最后一行.

如果datasource先设置,SelectedIndexChanged则会触发事件,您可能会收到强制转换错误或其他异常.

  • @John如果你看看它是如何在内部工作的,你会明白最后设置Datasource对性能至关重要.因为设置`ValueMember`不会触发任何操作.如果先设置Datasource,cbo将为您绑定值成员.然后,你将设置新的ValueMember [你想要的那个],cbo必须重新绑定绑定.因此,如果您最后设置DS,绑定将只发生一次. (4认同)

flo*_*dis 6

使用键值对填充组合框

填充组合框的一种巧妙方法是将数据源设置为键值对列表。它也可以激发使用存储在某种列表中的数据:

//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];
Run Code Online (Sandbox Code Playgroud)

也可以使用以下语法填充数据源:

ports.Select(p => new { Key = p, Value = p }).ToList();
Run Code Online (Sandbox Code Playgroud)

该技术可以扩展为多列列表的更多属性名称。


Aus*_*nen 2

他们拿绳子...

ComboBox1.ValueMember = "id"; 
ComboBox1.DisplayMember = "name";
Run Code Online (Sandbox Code Playgroud)