C#combobox重写了ToString

Moo*_*oon 6 c# combobox overriding tostring

我在使用ComboBox时遇到了一些问题.

我的组合框的显示成员没有被类MAP 的重写ToString方法填充.

这是我的代码:

Form1.cs中:

private void Form1_Load(object sender, EventArgs e) {  
    ...  
    ...      
    MAPList MAP = new MAPList();  
    comboBox1.DataSource = MAP.All;  
    comboBox1.ValueMember = "Code";  
    ...  
    ...  
}
Run Code Online (Sandbox Code Playgroud)

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jak*_*sen 9

如果设置,将不会调用ToString ValueMember.如果你没有设置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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在表单中设置DisplayMember:

MAPList MAP = new MAPList();
comboBox1.DataSource = MAP.All;
comboBox1.ValueMember = "Code";
comboBox1.DisplayMember = "Display";
Run Code Online (Sandbox Code Playgroud)