C#组合框被重写为字符串
我在使用ComboBox时遇到一些问题 “我的组合框”的显示成员没有被类映射的重写为字符串方法填充 这是我的密码: Form1.cs:C#组合框被重写为字符串,c#,combobox,tostring,overriding,C#,Combobox,Tostring,Overriding,我在使用ComboBox时遇到一些问题 “我的组合框”的显示成员没有被类映射的重写为字符串方法填充 这是我的密码: Form1.cs: private void Form1_Load(object sender, EventArgs e) { ... ... MAPList MAP = new MAPList(); comboBox1.DataSource = MAP.All; comboBox1.ValueMember = "
private void Form1_Load(object sender, EventArgs e) {
...
...
MAPList MAP = new MAPList();
comboBox1.DataSource = MAP.All;
comboBox1.ValueMember = "Code";
...
...
}
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));
}
}
}
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);
}
}
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
...
...
}
MAPList.cs:
private void Form1_Load(object sender, EventArgs e) {
...
...
MAPList MAP = new MAPList();
comboBox1.DataSource = MAP.All;
comboBox1.ValueMember = "Code";
...
...
}
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));
}
}
}
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);
}
}
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
...
...
}
这是因为您已将
ValueMember
属性设置为“code”,因此组合框中的值不是Map
对象,而是与其code
属性对应的字符串
如果删除此行:
comboBox1.ValueMember = "Code";
…它会像你期望的那样工作
如果希望组合框根据您的
Map
类型的ToString
方法显示其项目,则选择正确:在Map
类型上创建一个属性,该属性提供的字符串格式完全符合您的要求,并将组合框的DisplayMember
属性设置为此属性的名称。这可能是因为您使用了ValueMember。使用DisplayMember属性,在映射类的get中添加另一个属性,并返回格式化字符串 如果设置了ValueMember
,则不会调用ToString。如果不设置ValueMember
,它将按预期工作,但是code
当然不会用作组合框的选定值
或者,如果您希望使用ValueMember
,您也可以设置DisplayMember
。您可以在地图上创建一个用于显示的属性,即:
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";
我知道这是一篇老文章,但如果有人想使用ToString()而不创建一个属性来调用ToString(),则必须显式地将DisplayMember值设置为空字符串,如下所示: Form1.cs:
private void Form1_Load(object sender, EventArgs e) {
...
...
MAPList MAP = new MAPList();
comboBox1.DataSource = MAP.All;
comboBox1.ValueMember = "Code";
...
...
}
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));
}
}
}
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);
}
}
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
...
...
}
这是什么关系?我看不到你在任何地方调用对象映射,那么显示的是什么呢?只是“映射”?您正在将ValueMember设置为属性“代码”。在任何地方都不会调用.ToString重写。不要重写ToString,只需使用作为实例属性公开的代码并绑定到它。@Dan Tao:否。“code”@vodkhang:的值不重写ToString控制用户在combobox中看到的内容??我同意,这正是我以前实现它的方式。但我的要求迫使我在执行comboBox1时检索“Code”的值。SelectedValue不是格式化字符串。@Ruby:参见Jakob的答案;我认为这正是您想要的解决方案。仅供参考,您需要在
.DisplayMember
之前设置.ValueMember
。我做错了,但还是有问题。我一换就修好了!