这是我手动将少量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
答案 0 :(得分:5)
DisplayMember
和ValueMember
仅在您使用数据绑定(ListBox.DataSource
)时适用。它们可以使用可以通过反射检索的实际属性,也可以通过.NET组件模型和ICustomTypeDescriptor
接口进行工作。
如果直接绑定DataTable
,GetEnumerator
方法和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"]));