C# ComboBox.ValueMember和DisplayMember

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

如何设置此值?我有一个DataTable,里面有我想在combobox中设置的所有数据,但是我找不到如何设置它

我试过了

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();