Каков наилучший способ отобразить одно значение и сохранить другое в комбинированных списках .net? - PullRequest
2 голосов
/ 13 октября 2008

Кажется, я не могу найти простой в использовании .net собственный способ получения Combobox для winform-форм .net для отображения одного значения и возврата другого на основе выбора, не создавая свой собственный вспомогательный класс, зная, что winforms будет отображать метод ToString для объекта, который вы в него поместите.

Вот как я делаю это сейчас, очень обобщенно. Сначала создайте вспомогательный класс.

 Public Class ListItem
     Public Value As Object
     Public DisplayString As String

     Public Sub New(ByVal NewValue As Object, ByVal NewDisplayString As String)
         Value = NewValue
         DisplayString = NewDisplayString
     End Sub

     Public Overrides Function ToString() As String
         Return DisplayString
     End Function
 End Class

затем, чтобы загрузить выпадающий список из коллекции или чего-либо еще.

    For Each o as WhateverObject In CollectionIwantToaddItemsFrom
        li = New ListItem(o.ValueToReturn, o.ValueToDisplay)
        Me.ComboBox1.Items.Add(li)
    Next

и, наконец, использовать объект

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ComboBox1.SelectedIndexChanged
if me.combobox1.selecteditem is nothing then exit sub
Dim li As ListItem = me.ComboBox1.SelectedItem
Dim o as object = li.value 
'do stuff with o.
end sub

Я уверен, что есть кое-что, что я бы лучше использовал в рамках, на который я смотрю. Что это?

Ответы [ 4 ]

6 голосов
/ 13 октября 2008

Это что-то вроде хака, но это означает, что вам не нужно писать собственный класс пары «имя-значение» - ничего страшного (может быть, что-то лучше уже есть в фреймворке). Но то, что вы могли бы сделать, это использовать класс DictionaryEntry - который фактически является парой имя-значение. Добавьте элементы в список, затем используйте свойства DataMember и ValueMember в комбинированном списке, чтобы связать их со свойствами ключа и значения класса DictionaryEntry. Как это:

    var list = new List<System.Collections.DictionaryEntry>();
    list.Add(new System.Collections.DictionaryEntry("one", 1));
    list.Add(new System.Collections.DictionaryEntry("two", 2));
    list.Add(new System.Collections.DictionaryEntry("three", 3));

    comboBox1.DataSource = list;
    comboBox1.DisplayMember = "Key";
    comboBox1.ValueMember = "Value";

Просто понял, что вы предпочитаете диалект VB. Ниже делает то же самое для VB: -)

Dim list As List(Of DictionaryEntry)

list = New List(Of DictionaryEntry)
list.Add(New DictionaryEntry("One", 1))
list.Add(New DictionaryEntry("Two", 2))
list.Add(New DictionaryEntry("Three", 3))

ComboBox1.DataSource = list
ComboBox1.DisplayMember = "Key"
ComboBox1.ValueMember = "Value"
1 голос
/ 13 октября 2008

Из-за отсутствия лучшего понимания архитектуры вашего приложения вы, вероятно, выбираете хороший подход.

Обычно я связываю комбинированные списки с объектами DAL, где метод .ToString () переопределяется. По сути, это обеспечивает ту же функцию, хотя мне нужно преобразовать все, что выбрано в комбо, в его исходный тип, чтобы получить «значение» (обычно свойство, соответствующее PK объекта).

0 голосов
/ 13 октября 2008

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

0 голосов
/ 13 октября 2008

Ну, обычно объект, который вы поместите в коллекцию Items, будет иметь свой собственный ToString (), который представляет объект в презентабельной форме.

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

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