.Net: Лучший способ заполнить несколько полей со списком на форме в приложении Windows - PullRequest
1 голос
/ 26 мая 2010

Предположим, у вас есть выигрышная форма с 5 комбо-боксами на ней.

Кто-то сказал мне, что у вас должно быть 5 таблиц данных, чтобы заполнить их одну за другой. Это не кажется очень логичным, и я думаю, что это создаст некрасивый код.

Как вы заполняете их данными, хранящимися в базе данных?

Ответы [ 3 ]

4 голосов
/ 26 мая 2010

Я использую класс, который выглядит примерно так:

Public Class ComboboxBinder(Of TKey, TValue)
    Inherits List(Of KeyValuePair(Of TKey, TValue))

    Public Sub New()
    End Sub

    Public Overloads Sub Add(ByVal key As TKey, ByVal value As TValue)
        MyBase.Add(New KeyValuePair(Of TKey, TValue)(key, value))
    End Sub

    Public Sub Bind(ByVal control As ComboBox)
        control.DisplayMember = "Value"
        control.ValueMember = "Key"
        control.DataSource = Me
    End Sub

End Class

тогда, чтобы использовать его, вы должны поставить что-то вроде этого:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim binder As New ComboboxBinder(Of Guid, String)
    binder.Add(Guid.NewGuid, "Item 1")
    binder.Add(Guid.NewGuid, "Item 2")
    binder.Add(Guid.NewGuid, "Item 3")
    binder.Add(Guid.NewGuid, "Item 4")

    binder.Bind(ComboBox1)

End Sub

Winforms это такая боль с привязкой, но это решение работает достаточно хорошо для нашей компании. Также стоит отметить, что вы не можете связать с Dictionary, это должно быть IList или IListSource, следовательно, связыватель Combobox является List<KeyValuePair<TKey,TValue>>

1 голос
/ 26 мая 2010

BindingSource может быть вашим лучшим другом в Windows Forms.

Затем вы можете назначить свойство BindingSource.DataSource. Привязав свои ComboBox к времени разработки, то есть присваивая каждому свойству ComboBox.DataSource свой экземпляр BindingSource, все, что вам теперь нужно, это заполнить ваш BindingSource.

Пожалуйста, посмотрите мой ответ на этот вопрос SO , чтобы увидеть приблизительное пошаговое руководство по привязке данных Windows Forms с использованием класса BindingSource.

Что касается таблиц в стратегии ComboBox, это может быть полезно, поскольку у вас может быть таблица для иерархии. Здесь мы более вероятно обсудим объектно-реляционную стратегию персистентности, которая может быть долгой. Вкратце, см. Эту справочную документацию NHibernate и Chapter 8. Inheritence Mapping для получения дополнительной информации. Вы, скорее всего, будете обеспокоены Three Strategies.

Теперь я знаю, что вы не упоминаете NHibernate и т. Д. В своем вопросе. Моя цель - просто показать вам некоторые из самых популярных стратегий сохранения сущностей, которые косвенно задаются вашим вопросом.

1 голос
/ 26 мая 2010

Лично я думаю, что привязка данных WinForms болезненна, поэтому я делаю это вручную с помощью циклов for. Я бы просто перебрал один набор данных и добавил элементы в каждое поле со списком в этом цикле.

ПРИМЕЧАНИЕ: я бы никогда не подумал сделать это в WPF - механизм привязки данных намного лучше ...

...