0

我环顾四周,找不到我需要的东西。

我有一个带有(以及其他)3 个表的数据库。
SchemeType
Scheme
Type

SchemeType包含两个主键的外键SchemeType

我有一个包含 2 个组合框的 .NET 3.5 WinForm。
一个显示Schemes
我希望另一个显示该选定的表Types中存在的不同。SchemeTypeScheme

我有一个DataSet包含所有 3 个表的所有条目,并为主外键关系设置了 DataRelations。

我正在使用 BindingSources 来填充组合框,但是当我更改组合框时,我无法弄清楚如何让Type组合框刷新它的内容Scheme

我可以用直接的父子关系来做到这一点,但无法弄清楚如何编码父子关系。
这是我的代码,去掉了不必要的东西

    Dim DS As New DataSet("myDS")
    Dim SchemeBndSrc As New BindingSource
    Dim TypeBndSrc As New BindingSource

    Using cmd As New SqlCommand("myStroedProc", _conn)
        cmd.CommandType = CommandType.StoredProcedure
        Using adp As New SqlDataAdapter(cmd)
            adp.Fill(DS)
        End Using
    End Using

    ' Name the tables
    DS.Tables(0).TableName = "Scheme"
    DS.Tables(1).TableName = "Type"
    DS.Tables(2).TableName = "SchemeType"

    Dim rel As New DataRelation("Scheme-SchemeType", _
                                 DS.Tables("Scheme").Columns("SchemeID"), _
                                 DS.Tables("SchemeType").Columns("SchemeID"), _
                                 True)

    Dim rel2 As New DataRelation("Type-SchemeType", _
                                DS.Tables("Type").Columns("TypeID"), _
                                DS.Tables("SchemeType").Columns("TypeID"), _
                                True)

    DS.Relations.Add(rel)
    DS.Relations.Add(rel2)



    ' Scheme
    ' Set up the binding source
    SchemeBndSrc.DataSource = DS
    SchemeBndSrc.DataMember = "Scheme"

    ' Bind the bindingsource to the combobox
    cboScheme.ValueMember = "SchemeId"
    cboScheme.DisplayMember = "SchemeName"
    cboScheme.DataSource = SchemeBndSrc
    cboScheme.SelectedIndex = -1

    ' Type
    ' Set up the binding source
    TypeBndSrc.DataSource = SchemeBndSrc
    TypeBndSrc.DataMember = "Type-SchemeType"

    ' Bind the bindingsource to the combobox
    cboType.ValueMember = "TypeID"
    cboType.DisplayMember = "TypeDesc"
    cboType.DataSource = TypeBndSrc
    cboType.SelectedIndex = -1

类型组合框不包含任何项目,即使其中应该至少有 1 个项目。如果我交换DataRelation,它不会将它添加到DataSet,因为在这种情况下(SchemeType)没有TypeID的唯一条目。

任何人都可以帮助我吗?

4

2 回答 2

0

您不会通过数据绑定自动完成此操作。数据绑定可以处理基于选定父级过滤子列表,因此您可以让SchemeType列表根据选定的Scheme. 然后,您想要的是Type根据这些子记录获取所有父记录,而数据绑定不会这样做。那将必须是手动的。

Scheme像往常一样将您的和SchemeType表绑定到BindingSources 作为父子和子,子通过父BindingSource绑定到 s 。一旦选择了并且子过滤器自动过滤,您可以遍历它以获取记录的所有ID并使用它来为第三个构建一个值,例如DataRelationBindingSourceSchemeBindingSourceTypeFilterBindingSource

Dim typeIDs = schemeTypeBindingSource.Cast(Of DataRowView)().
                                      Select(Function(drv) CInt(drv("TypeID")))

typeBindingSource.Filter = String.Fomrat("TypeID IN ({0})",
                                         String.Join(", ", typeIDs))
于 2016-05-06T13:39:30.903 回答
0

我知道这是几年后的事了,但我会这样做:

在 SchemeType 数据表上,添加一个名为 ParentTypeDesc 的列,并将其.Expression属性设置为Parent(Type-SchemeType).TypeDesc- 这意味着 SchemeType 表将为每个 TypeID 将父名称导入自身

然后设置:

SchemeBindSrc.DataSource = theDataSet
SchemeBindSrc.DataMember = "Scheme"

还有魔法:

TypeBindSrc.DataSource = SchemeBindSrc 
TypeBindSrc.DataMember = "Scheme-SchemeType" 'the name of the datarelation

然后,绑定到 TypeBindSrc 的组合具有:

TypeCombo.DisplayMember = "ParentTypeDesc" ' the name of the column that imports the type name along the Type-SchemeType relation 
于 2020-05-24T07:55:27.307 回答