【问题标题】:WinForms Combobox: Fill with String and ObjectWinForms 组合框:用字符串和对象填充
【发布时间】:2016-05-21 11:25:25
【问题描述】:

我已经看到有很多关于此的主题,但我无法使它们起作用。

我有一个 Combobox,里面应该是一个字符串列表。

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

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

然后我想用一个对象列表填充一个组合框,这也不起作用。 itemData 是一个以 String 为键、Objectlist 为值的字典。

        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有什么区别?

【问题讨论】:

    标签: c# winforms combobox


    【解决方案1】:

    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",它将引用myItemName 属性,而后者又访问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 属性。

    【讨论】:

    • 谢谢,字符串列表是怎么回事?此外,myItem 类不是我的,我无法更改它。克服这个问题的最佳方法是什么?创建一个继承自 myItem 的类,然后为名称添加一个属性?
    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多