Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#组合框被重写为字符串_C#_Combobox_Tostring_Overriding - Fatal编程技术网

C#组合框被重写为字符串

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 = "

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

“我的组合框”的显示成员没有被类映射的重写为字符串方法填充

这是我的密码:

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
    ...  
    ...  
}
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
。我做错了,但还是有问题。我一换就修好了!