WinForms 组合框:填充字符串和对象

本文关键字:字符串 对象 填充 组合 WinForms | 更新日期: 2023-09-27 18:34:09

我已经看到有很多关于这个的主题,但我无法使它们工作。

我有一个组合框,里面应该填满一个字符串列表。

  this.elementBox.DataSource = this.elementList;  
  this.elementBox.SelectedIndexChanged += new EventHandler(this.elementBox_SelectedIndexChanged);

如果我将其放入代码中,我的 GUI 不会出现,我想数据的分配是错误的。我已经尝试过绑定源代码。

然后我想用对象列表填充一个组合框,这也不起作用。 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有什么区别?

WinForms 组合框:填充字符串和对象

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 属性,而属性又访问data.Name属性。

如果列表来自其他地方(您不拥有 list 类,因此无法修改其代码(,则必须将对象包装在另一个类中,并将列表替换为包装对象的列表:

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;}}
}

然后你可以摆脱显示成员赋值

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 属性。