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

时间:2016-02-10 21:46:25

标签: c# winforms combobox

我已经看到有很多关于此问题的主题,但我无法让它们发挥作用。

我有一个Combobox,它将填充一个String列表。

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

如果我把它放到代码中我的GUI没有出现,我想数据的分配是错误的。我已经尝试过Bindingsource了。

然后我想用一个对象列表填充一个Combobox,这也不起作用。 itemData是一个Dictionary,其中String为键,Objectlist为value。

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

显然我想在Combobox中显示myItem.data.name,但我不知道如何获取它。此外,DisplayMember与Value有什么区别?

1 个答案:

答案 0 :(得分:3)

DisplayMember期望公共财产不是私人领域

更改课程:

class myItem
{ 
   public int Id {get; set}
   public Internal data {get;set;}
}

class Internal 
{
   public string Name {get; set;} 
}

另请注意,属性名称区分大小写。所以'name'和'Name'被认为是不同的实体。

此外,如果要添加'myItem`类的对象,则无法使用组合框来访问成员的成员。你必须自己取得:

class myItem
{ 
   public int Id {get; set}
   public Internal data {get;set;}

   public string Name { get { return data.Name; }}
}

现在,通过将DisplayMember设置为"Name",它将引用Name的{​​{1}}属性,后者又会访问myItem属性。

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

data.Name

然后您可以摆脱DisplayMember分配

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

将改为调用ToString()。

但你必须更换

box1.DisplayMember = "Name";

添加更多代码:

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类的Item属性。