2013-05-09 110 views
0

你们中的一些人可能认为它已经在这个社区的其他地方解决了,但我无法真正解决它。 我有一个组合框,我喜欢它使用DataReader填充。像往常一样,我创建了一个类别以获得设置value memberdisplay member。我的代码在下面。ComboBox数据绑定不起作用使用DataReader

using (MySqlCommand cmd = new MySqlCommand("SELECT item_id, item_name FROM items WHERE status='active'", Class_Connection.conn)) 
     { 
      MySqlDataReader rdr = cmd.ExecuteReader(); 
      ArrayList temptbl = new ArrayList(); 
      while (rdr.Read()) 
      { 
       //MessageBox.Show(rdr.GetString(1).ToString() + "::" + rdr.GetString(0).ToString()); 
       temptbl.Add(new Class_NameValue(rdr.GetString(1), rdr.GetString(0))); 
      } 
      rdr.Close(); 

      // define Display and Value members 
      cmb_items.DisplayMember = "NameMember"; 
      cmb_items.ValueMember = "IdMember"; 
      // set the DataSource to the DataTable 
      cmb_items.DataSource = new BindingSource(temptbl, null); 
     } 

一开始设置类如下:

class Class_NameValue 
{ 
    private string myNameMember; 
    private string myValueMember; 

    public Class_NameValue(string strNameMember,string stringValueMember) 
    { 
     this.myNameMember = strNameMember; 
     this.myValueMember = stringValueMember; 


    } 
    public string NameMember 
    { 
     get 
     { 
      return myNameMember; 
     } 
    } 
    public string IdMember 
    { 
     get 
     { 
      return myValueMember; 
     } 
    } 
} 

代码编译OK。但是当应用程序运行时,它会给出错误 “Cannot bind to the new display member.Parameter name: newDisplayMember

我的代码有什么问题?任何人都可以帮忙吗?

在此先感谢。

回答

2

您需要设置数据源之前

DisplayMember和ValueMember属性。

喜欢

MySqlDataReader rdr = cmd.ExecuteReader(); 
ArrayList temptbl = new ArrayList(); 
while (rdr.Read()){ 
    temptbl.Add(new Class_NameValue(rdr.GetString(1), rdr.GetString(0))); 
} 
rdr.Close(); 
cmb_items.DisplayMember = "NameMember"; 
cmb_items.ValueMember = "IdMember"; 
cmb_items.DataSource = new BindingSource(temptbl, null); 

还有一个特技通过NameMemberIdMember

temptbl.Add(新Class_NameValue(rdr.GetString(1),rdr.GetInt32(0 )));

temptbl.Add(新Class_NameValue(NameMember = rdr.GetString(1)的ToString(),IdMember = rdr.GetString(0)的ToString()));

表示从这里设置属性value而不是类本身。 请尝试..

希望工程..

+0

我尝试过这一点。不起作用。但是,如果评论ValueMember行,它工作正常。但那样,我没有得到物品的价值。 – 2013-05-09 10:13:06

+0

这意味着任何一个NameMember都没有IdMember,请尝试在sql或mysql编辑器中运行您的查询以检查null IdMember值。 – Rahul 2013-05-09 10:15:03

+0

是'Idmember'是否是主要的列值... – Rahul 2013-05-09 10:21:24

0

尝试这样做:

var bs = new BindingSource(temptbl, null); 
cmb_items.DataSource = bs; 
cmb_items.DisplayMember = "yourDisplayMember"; 
cmb_items.ValueMember = "yourValueMember"; 
+0

这就是我一直试图做的@ 03Usr。使用DataReader添加项目时绑定不起作用。 – 2013-05-10 02:54:34