我将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()将绘制所需的显示值。是否有任何方法可以像这样覆盖以添加值项目?
答案 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...
}
输出将是......
表格中特定列的列表。这里'数据'。