为什么DisplayMember不能与ListBox中手动添加的DataRow一起使用?

时间:2016-03-22 09:18:43

标签: c# winforms ado.net

这是我手动将少量DataRow添加到this.listBox1.Items并在WinForms Designer中将DisplayMember设置为列名的内容,但稍后显示的是类型名称列表(System.Data .. 。)

如何解决这个问题?

CODE:

list1.ForEach(x => this.listBox1.Items.Add(x)); //x is DataRow from a filled DataTable

2 个答案:

答案 0 :(得分:5)

DisplayMemberValueMember仅在您使用数据绑定(ListBox.DataSource)时适用。它们可以使用可以通过反射检索的实际属性,也可以通过.NET组件模型和ICustomTypeDescriptor接口进行工作。

如果直接绑定DataTableGetEnumerator方法和IList实现将始终返回DataRowView个实例,而不是DataRow个。 DataRowView实现了ICustomTypeDescriptor DisplayName可以引用列名。

因此,如果您想添加一些自定义过滤列表,我建议您从任何来源创建一个。例如:

listBox1.DisplayMember = "Name";
listBox1.ValueMember = "Value";

var list = Enumerable.Range(1, 10).Select(i => new {Name = i.ToString(), Value = i}).ToList();
listBox1.DataSource = list;

如果存在Name属性,您将看到其值;否则,您将看到ToString项目。

但是,如果您以编程方式添加项目(ListBox.Items),则会忽略这些属性,并且始终会使用项目的ToString

答案 1 :(得分:2)

指定要添加到列表框的列名:

list1.ForEach(x => this.listBox1.Items.Add(x["column_name"]));