gpt4 book ai didi

c# - 为什么 DisplayMember 不适用于 ListBox 中手动添加的 DataRow?

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:09 24 4
gpt4 key购买 nike

我在 this.listBox1.Items 中手动添加了一些 DataRow,并在 WinForms Designer 中将 DisplayMember 设置为列名,但我稍后显示的只是一个类型名称列表(System.Data...)。

如何解决这个问题?

代码:

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

最佳答案

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

如果直接绑定(bind) 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

关于c# - 为什么 DisplayMember 不适用于 ListBox 中手动添加的 DataRow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36150378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com