我已经看到有很多关于此问题的主题,但我无法让它们发挥作用。
我有一个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有什么区别?
答案 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
属性。