Как установить текст элементов списка в Windows Forms - PullRequest
1 голос
/ 28 мая 2009

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

У меня есть элемент управления checklist,

    Friend WithEvents clstTasks As System.Windows.Forms.CheckedListBox

, который я обычно хочу заполнить списком имен задач. Я вызываю метод add, чтобы добавить объект Task в список. Я знаю, что если я переопределю метод ToString, любое значение, возвращаемое этой функцией, будет отображаться как текст для элемента списка.

Однако в редких случаях я хочу отображать что-то другое, а не только имя. Например, возможно, я хочу отобразить имя и значение другого свойства, например значение логического свойства «Необязательно», показанное в скобках после имени.

Каков наилучший способ сделать это?

Лучшее, что я могу придумать, - это определить свойство, которое устанавливается на уровне GUI и затем используется функцией ToString, чтобы определить, как оно должно вести себя при вызове. Если управляющему свойству присвоено одно значение, ToString вернет Name, в противном случае вернет Name, за которым следует значение флага Optional. Мне кажется, это немного противоречит.

Другая альтернатива, которая кажется немного излишней, - определить новый класс, который наследуется от Task, например TaskOptional, который переопределяет метод Tostring в базовом классе. В этом подклассе функция ToString возвращает значение флага Name / Optional. Тем не менее, это тоже кажется немного чокнутым, когда приходится придумывать новый класс просто для того, чтобы изменить способ отображения текста на уровне представления. Я чувствую, что смогу контролировать это на уровне представления, не меняя бизнес-объект и не создавая новый производный объект.

Каков наилучший способ сделать это?

    For Each CurrentTask As Task In _MasterTaskList
        clstTasks.Items.Add(CurrentTask, True)
    Next

    Public Class Task

       Private _Name As String
       Private _Optional As Boolean

       Public Sub New (name As String, optional As Boolean)
           _Name = name
       End Sub

       Public Overrides Function ToString() As String
           Return _Name
           End If
       End Function

    End Class

Ответы [ 2 ]

2 голосов
/ 28 мая 2009

Вы можете установить свойство DisplayMember вашего CheckedListBox на имя одного из свойств вашего пользовательского класса.

Допустим, вы создали свойство, подобное следующему:

Public ReadOnly Property NameOptional() As String
  Return _Name & " (" & _Optional & ")"
End Property

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

clstTasks.DisplayMember = "NameOptional"

Когда вы устанавливаете элемент отображения, это свойство будет отображаться вместо значения ToString.

1 голос
/ 28 мая 2009

Вы можете сделать следующее

Public Overrides Function ToString() As String
   Return string.Format("{0}{1}", _Name, IIF(_Optional, " (Optional)", ""))
End Function

РЕДАКТИРОВАТЬ: вам придется установить значение _optional в конструкторе, который отсутствует в коде, который вы предоставили.

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