将组合框绑定到父级DataRelation并在第二个父级更改时更新

时间:2016-05-06 11:01:16

标签: c# vb.net winforms combobox datarelation

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

我有一张DB(其他人)3张桌子 SchemeType
Scheme
Type

SchemeType包含SchemeType

主键的外键

我有一个包含2个组合框的.NET 3.5 WinForm 一个显示Schemes
我希望对方显示所选Types SchemeType表格中存在的不同Scheme

我有一个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

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

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

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

将您的SchemeSchemeType表格与父母和孩子一样绑定到BindingSource,并将孩子BindingSource绑定到DataRelationBindingSource。选择Scheme并且子BindingSource自动过滤后,您可以循环浏览它以获取Type记录的所有ID,并使用它来构建Filter第三个BindingSource的值,例如

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

typeBindingSource.Filter = String.Fomrat("TypeID IN ({0})",
                                         String.Join(", ", typeIDs))

答案 1 :(得分: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