Переопределение ToString () и добавление в ListBox C # - PullRequest
8 голосов
/ 21 апреля 2011

Может кто-нибудь объяснить это:

public class Test : List<int>
{
    public override string ToString()
    {
        return "My ToString";
    }
}

Если я его создаю и добавляю к элементу управления ListBox в Windows Form, он отображает «Коллекция», а не «Моя ToString».

Test test = new Test();
listBox1.Items.Add(test);

Я думал, что добавление к Items просто назовет ToString() моего класса. Следующие работы, как и ожидалось, конечно,

MessageBox.Show(test.ToString());

Ответы [ 5 ]

7 голосов
/ 21 апреля 2011

Чтобы это работало, вы должны отключить форматирование:

listBox1.FormattingEnabled = false;

Похоже, если форматирование включено, оно выполняет некоторые фокусы, и результат не всегда такой, каким он должен быть ...

4 голосов
/ 21 апреля 2011

Установите для DisplayMember в ListBox свойство типа Тест.

listBox1.DisplayMember = "Name";

Чтобы решить вашу проблему, добавьте свойство с именем «Name» в Type и в методе getter вызовите ToString.

public class Test : List<Int32>
{
    public String Name { get { return this.ToString(); } }

    public override string ToString()
    {
        return "Test";
    }
}
0 голосов
/ 30 января 2012

Я тоже сталкивался с этим (и еще одно спасибо, Манджи!). У меня было что-то вроде этого:

public override string ToString()
    {
        return  MessageText;
    }

Где MessageText был текстовым полем среди нескольких других, и он работал нормально. Позже я изменил это на это

public override string ToString()
    {
        return string.Concat("[", MessageTime.ToString("yyyy-MM-dd HH:mm:ss.fffff"), "] ", MessageText);
    }

И он все равно будет возвращать только содержимое поля MessageText (время вытягивания волос). Интересно, что контекстное меню в ListBox, которое я настроил для копирования выбранных элементов в буфер обмена, использовало полное переопределение ToString.

Лично я считаю, что свойство FormattingEnabled должно иметь значение по умолчанию false, а не true, я нахожу, что меня часто ловит IDE (или параметры управления), пытающиеся быть умными.

/// Правка: опечатка (не забывайте печатать локтями!

0 голосов
/ 21 апреля 2011

Элементы в ListBox представляют собой набор объектов, а не строк.

См. MSDN: ListBox.ObjectCollection.Add Method

Поэтому вы должны добавитьЭкземпляр в виде строки (например: listBox1.Items.Add(test.ToString());) на внешнем интерфейсе или на внутреннем интерфейсе, когда вы смотрите на список, вы должны вызвать ToString (например: listBox1.Items[0].ToString();).

0 голосов
/ 21 апреля 2011

Не должно ли быть так:

listBox1.Items.Add(test.ToString());

Я полагаю, вы хотите, чтобы ваш список содержал строковый тип?

Не уверен, что это правильно, но я не проверял.

...