使用ComboBox时遇到了一些问题。
我的组合框的显示成员没有被类MAP的 重写的ToString 方法填充。
这是我的代码:
Form1.cs中:
private void Form1_Load(object sender, EventArgs e) {
...
...
MAPList MAP = new MAPList();
comboBox1.DataSource = MAP.All;
comboBox1.ValueMember = "Code";
...
...
}
MAPList.cs:
public class MAPList {
public readonly List<MAP> All;
public MAPList() {
All = new List<MAP>();
var MapData = // Getting map data
foreach(MAP m in MapData) {
All.Add(new Map(m.Name, m.Code));
}
}
}
MAP.cs:
public class MAP {
public readonly string Name;
private string code;
public string Code { get { return code; } }
public RadioCode(string Name, string Code) {
this.Name = Name;
this.code = Code;
}
public override string ToString() {
return String.Format("{0}: {1}", Name, Code);
}
}
答案 0 :(得分:9)
如果设置ValueMember
,则不会调用ToString。如果您未设置ValueMember
,它将按预期工作,但当然Code
将不会用作ComboBox的选定值。
或者,如果您想使用ValueMember
,您可能还想设置DisplayMember
。您可以在MAP
上创建用于显示的属性,即:
public class MAP
{
public readonly string Name;
private string code;
public string Code { get { return code; } }
public string Display { get { return ToString(); } }
public MAP(string Name, string Code)
{
this.Name = Name;
this.code = Code;
}
public override string ToString()
{
return String.Format("{0}: {1}", Name, Code);
}
}
然后,您可以在表单中设置DisplayMember
:
MAPList MAP = new MAPList();
comboBox1.DataSource = MAP.All;
comboBox1.ValueMember = "Code";
comboBox1.DisplayMember = "Display";
答案 1 :(得分:1)
这是因为您已将ValueMember
属性设置为“代码”,因此组合框中的值不是您的Map
对象,而是与其Code
属性对应的字符串
如果删除此行:
comboBox1.ValueMember = "Code";
......它会像你期望的那样工作。
如果您希望ComboBox根据Map
类型的ToString
方法显示其项目,则Jakob's answer正确:在您的上创建一个属性Map
类型,提供完全按照您希望的方式格式化的字符串,并将ComboBox的DisplayMember
属性设置为 this 属性的名称。
答案 2 :(得分:0)
这可能是因为你使用的是ValueMember。使用 DisplayMember 属性,在获取此属性的Map类中添加另一个属性,返回格式化的字符串。
答案 3 :(得分:0)
我知道这是一篇旧帖子,但如果有人想要使用ToString()而不创建一个只调用ToString()的属性,则必须将DisplayMember值显式设置为空字符串,如下所示:
<强> Form1.cs中:强>
private void Form1_Load(object sender, EventArgs e) {
...
...
MAPList MAP = new MAPList();
comboBox1.DataSource = MAP.All;
comboBox1.ValueMember = "Code";
comboBox1.DisplayMember = ""; // Explicitly set it to an empty String
...
...
}