C#combobox重写了ToString

时间:2010-09-08 05:51:45

标签: c# combobox tostring override

使用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);
    }
}

4 个答案:

答案 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
    ...  
    ...  
}