Элемент управления Listbox (тьфу) Несколько имен? - PullRequest
4 голосов
/ 12 февраля 2010

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

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

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

Я дошел до создания класса:

Class Item
    Property ID as Integer
    Property Name as String

    Sub New(ID as Integer, Name as String)
        Me.ID = ID
        Me.Name = Name
    End Sub

    Overrides Function ToString() as String
        Return Name
    End Function
End Class

Похоже, это должно сработать, но у меня проблемы с получением идентификатора вместо имени. Проще говоря, я хотел бы сделать это: listbox1.selecteditem (id), чтобы получить идентификатор, или listbox1.selecteditem (name), чтобы получить имя.

Пожалуйста, помогите!

Ответы [ 2 ]

3 голосов
/ 12 февраля 2010

Вы можете привязать к List(Of Item) вот так:

Dim ItemList = New List(Of Item)
' Fill the list with appropiate values.'
listbox1.DataSource = ItemList
listbox1.DisplayMember = "Name"
listbox1.ValueMember = "ID"

Затем listbox1.SelectedValue содержит ID, и вы можете получить доступ к имени следующим образом:

DirectCast(listbox1.SelectedItem, Item).Name

Если вы хотите показать и ID, и Name, то я предлагаю вам добавить свойство, которое будет отображаться в классе Item:

Public ReadOnly Property DisplayedValue() as String
    Get
        Return Me.Name & " (" & Me.ID.ToString & ")"
    End Get
End Property

Тогда при связывании списка сделайте

 listbox1.DisplayMember = "DisplayedValue"

Обновление:

На основании ваших комментариев ниже я бы сказал, что мое решение все еще работает. Однако с помощью этой методологии элементы должны быть добавлены в список, а затем список, связанный с объектом. Элементы не могут быть добавлены по отдельности и непосредственно в список (так как вы отделяете данные от представления, я не вижу в этом проблемы).

Чтобы показать окно сообщения с выбранным элементом, вам просто нужно сделать:

MessageBox.Show(DirectCast(listbox1.SelectedItem, Item).ID.ToString))
0 голосов
/ 12 февраля 2010

Я думаю, вам придется написать вспомогательный метод для этого. Если вы используете VB 3.5 или новее (часть VS2008 и новее), вы можете написать метод расширения , чтобы вы могли хотя бы получить хороший синтаксис. Вы могли бы написать один такой, чтобы он выглядел так:

listbox1.SelectByID(123)
listbox1.SelectByName("hello")

В этих методах у вас был бы какой-то алгоритм поиска, который просматривал предметы и находил правильный.

...