1

假设您有一个带有 5 个组合框的获胜表格。

有人告诉我,你必须有 5 个数据表才能一张一张地填写。这似乎不太合乎逻辑,我认为这会产生丑陋的代码。

你如何用存储在数据库中的数据填充它们?

4

3 回答 3

4

我使用一个看起来像这样的类:

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 的绑定非常痛苦,但这个解决方案对我们公司来说已经足够好了。另外值得注意的是,您不能绑定到 a Dictionary,它必须是IListor 和IListSource,因此为什么Comboboxbinder 是 aList<KeyValuePair<TKey,TValue>>

于 2010-05-26T10:52:26.020 回答
1

BindingSource可以成为您在 Windows 窗体中最好的朋友。

然后,您可以分配BindingSource.DataSource财产。在设计时绑定你的ComboBoxes,也就是说,将每个ComboBox.DataSource属性设置为你的实例BindingSource,你现在需要的只是填充你的BindingSource.

请参阅我对这个 SO 问题的回答,以查看使用BindingSource该类的 Windows 窗体 DataBinding 的大致演练。

至于每个 ComboBox 策略的表,这可能很有用,因为您可以每个层次结构都有一个表。在这里,我们更有可能讨论一种对象关系持久性策略,这可能是一个很长的路要走。简而言之,请参阅此 NHibernate 参考文档和Chapter 8. Inheritence Mapping了解更多详细信息。您更有可能会担心Three Strategies.

现在我知道,您在问题中没有提到 NHibernate 等。我的目标是简单地向您展示一些最流行的实体持久性策略,这是您的问题间接提出的。

于 2010-05-26T13:19:09.650 回答
1

就个人而言,我认为 WinForms 数据绑定很痛苦,所以我使用“for”循环手动完成。我只需遍历一个数据集并将元素添加到该循环中的每个组合框。

注意:我永远不会想到在 WPF 中这样做——它的数据绑定机制要好得多......

于 2010-05-26T10:37:02.007 回答