簡體   English   中英

WinForms組合框:填充字符串和對象

[英]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" ,它將引用myItemName屬性,該屬性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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM