使用ValueMember绑定ListBox

时间:2013-12-14 14:58:06

标签: c# .net winforms

我将ListBox扩展为构建我的CustomListbox。

它将接受classobject数组作为数据源,并重写OnDrawItem()以通过读取classobject数组来显示它们。

到此为止一切正常。问题是我无法读取列表框的ValueMember,因为我没有分配它。我想将我的classObject的一个属性添加为Value Member

伪代码:

public class myModel
{
  int id;
  string name;
  XXXXXXXXX
  XXXXXXXXX
}

myModel[] ds = getData();
//myCustomListbox.ValueMember = "id";   //this doesnt seem to work
myCustomListbox.DataSource =ds;

我再说一遍,OnDrawItem()将绘制所需的显示值。是否有任何方法可以像这样覆盖以添加值项目?

2 个答案:

答案 0 :(得分:0)

绑定仅适用于属性。将您的字段更改为属性(并确保它是公共的 - 默认类成员是私有的)

public class myModel
{
   public int id { get; set; }
   public string name { get; set; }
   // ...
}

现在一切都好了:

myModel[] ds = getData();
myCustomListbox.ValueMember = "id";
myCustomListbox.DataSource = ds;

BTW C#naming guidelines建议使用Pascal Names作为属性,方法和类型名称。

答案 1 :(得分:0)

列表框与C#中的数据表绑定(在Windows应用程序中)是添加值成员所必需的。

如果我们制作没有值成员的代码,如下所示,

 private void button1_Click(object sender, EventArgs e)
    {
        SqlDataAdapter da = new SqlDataAdapter("select * from Table1",con);
        da.Fill(dt);

        listBox1.DataSource = dt;
        // listBox1.ValueMember = "data";  //data is one of the coloumn of the table...

    }

以上代码的输出在下面给出

System.Data.DataRowView

System.Data.DataRowView

System.Data.DataRowView

如果我们在代码中提供值成员,如下所示

private void button1_Click(object sender, EventArgs e)
  {
    SqlDataAdapter da = new SqlDataAdapter("select * from Table1",con);
    da.Fill(dt);
    listBox1.DataSource = dt;
    listBox1.ValueMember = "data";  //data is one of the coloumn of the table...
  }

输出将是......

表格中特定列的列表。这里'数据'。