0

私は周りを見回しましたが、必要なものがまったく見つかりません。

私は(とりわけ)3つのテーブルを持つDBを持っています。
SchemeType
Scheme
Type

SchemeTypeSchemeとの両方の主キーへの外部キーを含むType

2 つのコンボボックスを含む .NET 3.5 WinForm があります。
1 つはSchemes
I would like を表示し、もう1 つは選択したテーブルにTypes存在する個別のものを表示します。SchemeTypeScheme

DataSet3 つのテーブルすべてのすべてのエントリを含む があり、Primary-Foreign キー関係の DataRelations を設定しました。

TypeBindingSources を使用してコンボボックスにデータを入力していますが、コンボボックスを変更したときにコンボボックスの内容を更新する方法がわかりません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 を入れ替えても、この場合の親 (SchemeType) には TypeID の一意のエントリがないため、DataSet に追加されません。

誰でも私を助けてもらえますか?

4

2 に答える 2

0

データバインディングを介して自動的にそれを達成するつもりはありません。データバインディングは、選択された親に基づいて子リストのフィルタリングを処理できるため、SchemeType選択された に基づいてリストを自動的にフィルタリングすることができますScheme。次に必要なのは、Typeそれらの子レコードに基づいてすべての親レコードを取得することですが、これはデータバインディングでは実行できません。それは手動でなければなりません。

SchemeSchemeTypeテーブルをBindingSource通常のように親と子として s にバインドし、子は parent を介して にBindingSourceバインドします。が選択され、子が自動的にフィルター処理されると、それをループしてレコードのすべての ID を取得し、それを使用して 3 番目のの値を構築できます。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 に答える