C # combobox переопределил ToString - PullRequest
       29

C # combobox переопределил ToString

6 голосов
/ 08 сентября 2010

У меня возникают проблемы при работе с ComboBox.

Элемент отображения для моего комбинированного списка не заполняется переопределенным методом ToString * класса 1005 * класса MAP.

Вот мой код:

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 ]

9 голосов
/ 08 сентября 2010

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

В форме вы можете установить DisplayMember:

MAPList MAP = new MAPList();
comboBox1.DataSource = MAP.All;
comboBox1.ValueMember = "Code";
comboBox1.DisplayMember = "Display";
1 голос
/ 08 сентября 2010

Это потому, что вы установили для своего свойства ValueMember значение «Код», поэтому значения в выпадающем списке - это не ваши Map объекты, а строки, соответствующие их Code свойствам.

Если вы удалите эту строку:

comboBox1.ValueMember = "Code";

... она будет работать так, как вы ожидаете.

Если вы хотите, чтобы ComboBox отображал его элементы в соответствии с вашимMap метод ToString типа, затем ответ Якоба прямо: создайте свойство для вашего типа Map, которое предоставляет строку, отформатированную именно так, как вам нужно, и установите свойство DisplayMember дляComboBox на имя это свойство.

0 голосов
/ 27 января 2015

Я знаю, что это старая запись, но если кто-то захочет использовать 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
    ...  
    ...  
}
0 голосов
/ 08 сентября 2010

это может быть потому, что вы используете ValueMember. используйте DisplayMember Свойство, добавьте другое свойство в класс Map, чтобы получить это свойство и вернуть отформатированную строку.

...