[英]Why DisplayMember doesn't work with manually added DataRow in ListBox?
這是我手動向this.listBox1.Items
添加一些DataRow的東西,並在WinForms Designer中將DisplayMember
為列名,但是稍后顯示的只是類型名稱的列表(System.Data ...)。
如何解決這個問題?
碼:
list1.ForEach(x => this.listBox1.Items.Add(x)); //x is DataRow from a filled DataTable
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
。
指定要添加到列表框中的列名:
list1.ForEach(x => this.listBox1.Items.Add(x["column_name"]));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.