Переопределение ToString () и добавление в ListBox C#

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

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

если я создам этот экземпляр и добавлю его в ListBox управление на Windows Form, он отображает "Collection", а не"My ToString".

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

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

MessageBox.Show(test.ToString());

5 ответов


для этого вам нужно отключить форматирование:

listBox1.FormattingEnabled = false;

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


установите DisplayMember в списке в свойство типа теста.

listBox1.DisplayMember = "Name";

чтобы решить вашу проблему, добавьте свойство с именем "Name" для ввода и вызова getter ToString.

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

    public override string ToString()
    {
        return "Test";
    }
}

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

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

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

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


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

посмотреть MSDN: список.ObjectCollection.Метод Add

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


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

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 (время вытягивания волос). Интересно, что контекстное меню в списке, который я настроил для копирования выбранных элементов в буфер обмена, использовало полное переопределение ToString.

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

/ / / Edit: опечатка (необходимо помнить, чтобы не вводить с локтями!