[英]WinForms Combobox: Fill with String and Object
我已經看到有很多與此相關的主題,但是我無法使它們起作用。
我有一個組合框,其中將填充一個字符串列表。
this.elementBox.DataSource = this.elementList;
this.elementBox.SelectedIndexChanged += new EventHandler(this.elementBox_SelectedIndexChanged);
如果將其放入代碼中,則不會出現我的GUI,則我認為數據分配錯誤。 我已經嘗試了Bindingsource。
然后,我想用對象列表填充組合框,這也不起作用。 itemData是一個字典,以字符串為鍵,對象列表為值。
box1.DataSource = itemData["ele1"];
box1.DisplayMember = "Name";
box2.DataSource = itemData["ele2"];
box2.DisplayMember = "Id";
我嘗試使用DisplayMember和Value,但無法使其正常工作。 列表的類型為MyItem:
class myItem{ int Id; Internal data;}
class Internal {String name;}
顯然,我想在組合框中顯示myItem.data.name,但我不知道如何獲取它。 此外,DisplayMember和Value有什么區別?
DisplayMember期望公共財產而不是私人領域
更改類別:
class myItem
{
public int Id {get; set}
public Internal data {get;set;}
}
class Internal
{
public string Name {get; set;}
}
還請注意,屬性名稱區分大小寫。 因此,“名稱”和“名稱”被認為是不同的實體。
此外,如果要添加“ myItem”類的對象,則無法獲得組合框來訪問成員的成員。 您將必須自己進行以下操作:
class myItem
{
public int Id {get; set}
public Internal data {get;set;}
public string Name { get { return data.Name; }}
}
現在,通過將DisplayMember
設置為"Name"
,它將引用myItem
的Name
屬性,該屬性myItem
又訪問data.Name
屬性。
如果列表是從其他地方來的(您不擁有列表類,因此無法修改其代碼),則必須將對象包裝在另一個類中,然后用包裝對象的列表替換列表:
class myItemWrapper
{
private myItem _myItem;
public myItemWrapper(myItem item)
{
_myItem = item;
}
public override string ToString()
{
return _myItem.data.Name;
}
public myItem Item { get { return _myItem;}}
}
那么您就可以擺脫DisplayMember的分配
box1.DisplayMember = "Name";
因為ToString()將被調用。
但您必須更換
box1.DataSource = itemData["ele1"];
與更多的代碼:
var wrapper = new List<myItemWrapper>();
foreach(var item in itemData["ele1"]);
wrapper.Add(new myItemWrapper(item));
box1.DataSource = wrapper;
並且不要忘記,當您處理列表框中的選定項目時,不再處理myItem
對象,而是處理myItemWrapper
對象。 因此,要訪問實際的myItem
對象,您將不得不使用myItemWrapper
類的Item
屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.