2012-03-01 179 views
2

如何设置此值?我有一个DataTable与我想在组合框中设置的所有数据,但我无法找到如何设置它。ComboBox.ValueMember和DisplayMember

我试图

ComboBox1.DataSource = dataTable; 
ComboBox1.ValueMember = "id"; // --> once hes here, he just jumps out the method 
ComboBox1.DisplayMember = "name"; 

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

这是查询填补的DataTable

"Select * from \"Table\"" 

我与调试检查,并在数据表中弥漫。列名称是“id”和“name”。组合框是空白的。我第一次填充它!

+1

这实际上不会编译。 – SLaks 2012-03-01 18:41:39

+0

不,我错了......这是与“身份证”和“名称”。斯里布特 – dbncourt 2012-03-01 18:56:19

+0

可以id为空? – Arie 2013-03-14 15:00:04

回答

1

他们采取串...

ComboBox1.ValueMember = "id"; 
ComboBox1.DisplayMember = "name"; 
+0

mmm,nop!它不起作用。 ü看到,dataTable具有值,因为我检查与debbuger,这些列名称是完全id和名称。如果我把它像你一样,id列在组合框中,出于某种原因,idk cuz名称中包含名称。它永远不会到达displaymamber线。 – dbncourt 2012-03-01 18:51:29

+0

我认为dataTable不是一个有效的源,我看到它与DataSource,但我没有:/,也许我可以解析DataTable到一个DataSource? – dbncourt 2012-03-01 18:52:53

+0

这是最好的基于提供的代码可以提供的... – 2012-03-01 18:53:03

0

您可以指定这样

ComboBox1.ValueMember = "id"; 
    ComboBox1.DisplayMember = "name"; 
2
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 
+0

ComboBox1.DataBind();这不存在。至少不在我的版本(Visual Studio 2010)ComboBox.DataBindings中。并不是一种方法。 – dbncourt 2012-03-01 19:10:07

+0

DataBind()仅适用于Web应用程序;如果它是一个Windows应用程序,则不需要该行 – PraveenVenu 2012-03-01 19:54:48

11

你不应该设置你的列表框和/或组合框的datasource顺序

ComboBox1.DataSource = dataTable; 

ComboBox1.ValueMember = "id"; 

ComboBox1.DisplayMember = "name"; 

相反,这是正确的顺序:

ComboBox1.ValueMember = "id"; 

ComboBox1.DisplayMember = "name"; 

ComboBox1.DataSource = dataTable; 

注意:设置datasource应该是最后一道防线。

如果您先设置datasource,则SelectedIndexChanged事件将触发,您可能会收到投射错误或其他异常。

+0

没有意义;如果您不首先给数据源赋予组合框,那么它会如何知道“ValueMember”应该是什么,如果它没有数据,“DisplayMember”应该是什么。这是一种反直觉的做法。 – John 2015-05-07 20:31:08

+0

@John你是对的,它是反直觉的,但它的工作原理。搜索combobox datarowview,你会看到其他人有同样的问题。 – DrewJordan 2015-05-22 19:08:02

+2

@John如果你看看它在内部是如何工作的,你会明白,最后设置Datasource对性能至关重要。因为设置'ValueMember'不会触发任何操作。如果您先设置Datasource,则cbo将为您绑定值成员。然后,您将设置新的ValueMember [您想要的],并且cbo将不得不重新绑定绑定。因此,如果您将DS设置为最后一次,绑定只会发生一次。 – 2016-06-28 02:55:39

1
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. 
} 
+1

你的回答应该包含你的代码的解释和描述它是如何解决问题的。 – AbcAeffchen 2014-12-13 00:14:47

1

我有同样的麻烦。在我的情况下,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); 

它对我有用。 =)

1

使用键值对填充ComboBox

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

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

的technicue可与多种更多的属性名扩大列列表。

0
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 :) 
相关问题