C # CheckListBox - Как добавить объект и чтобы этот объект отображал текст - PullRequest
3 голосов
/ 04 сентября 2011

Я хочу иметь ряд объектов, которые можно добавить в checkListBox в C #, и чтобы эти объекты могли генерировать свои собственные строки, отображаемые в списке.Я нашел пример того, что я хочу сделать в Visual Basic .

Однако я не могу понять, как это сделать в c #.Я пытался реализовать свой собственный класс:

public class Device  {
    String s;

    public Device() {
        s = new String("test".ToCharArray());

    }

    public String toString() {
        return s;
    }
}

Но когда я его запускаю, он отображает «WindowsFormsApplication2.Device» в списке, а не тестирует ..

Любые предложения будутпризнателен.

Спасибо, Реза

ps можно ли будет отображать текст и индикатор выполнения для каждой записи в контрольном списке?

Ответы [ 4 ]

5 голосов
/ 04 сентября 2011

Вы неправильно переопределяете виртуальный метод Object.ToString():

  1. Имя метода написано неправильно (C # чувствителен к регистру).
  2. Модификатор override в методе отсутствует; требуется при переопределении виртуального метода.

Сделайте так:

public override string ToString()
{
    return s;
}
1 голос
/ 04 сентября 2011

the_ajp правильно указал, что реальная проблема - это camelCase toString, когда это должен быть PascalCase ToString.

public override String ToString() {
    return s;
}

Кроме того, не смотрите примеры Java при кодировании C #, s = new String("test".ToCharArray()); должно быть просто s = "test";.

1 голос
/ 04 сентября 2011

сделайте ваш метод toString следующим образом:

public override string ToString(){
    return s;
}
0 голосов
/ 04 сентября 2011

У вас уже есть ответ, но вот прием, который мне нравится использовать.Что мне не нравится в использовании метода ToString () в вашей модели, так это то, что он смешивает бизнес и логику просмотра.

Вместо этого я создаю класс-оболочку (шаблон проектирования адаптера), который сохраняет ссылку намодель объекта и предоставляет собственный метод ToString.Вы можете комбинировать это с анонимными функциями, чтобы указать, как именно должна быть отображена отображаемая строка (вы можете захотеть отображать немного разные строки в разных списках).

Класс оболочки может выглядеть следующим образом:

class ListBoxWrapper<T>
{
    private T obj;
    private Func<T, string> stringFunction;

    public ListBoxWrapper(T obj, Func<T, string> stringFunction)
    {
        this.obj = obj;
        this.stringFunction = stringFunction;
    }

    public override string ToString()
    {
        return stringFunction(obj);
    }
}

Чтобы просто использовать ToString () модели, вы все равно можете сделать:

ListBox.Items.Add(new ListBoxWrapper<Device>(device, dev => dev.ToString()));

Но вы также можете сделать (например):

ListBox.Items.Add(new ListBoxWrapper<Device>(device, dev => dev.SerialNumber.ToString()));

Чтобы сделатьэто более полезно, вы можете создать свой собственный класс, производный от ListBox или CheckedListBox, который автоматически обернет ваши объекты.Таким образом, вы также можете хранить строковую функцию в ListBox вместо каждого отдельного элемента.

...