2016-05-06 9 views
0

私は見回して、私が必要とするものを見つけることができません。コンボボックスと親データのバインドをバインドし、2番目の親が変更されたときに更新する

私はDBを(他のamoung)3テーブルを持っています。
SchemeType
Scheme
Type

SchemeType I 2つのコンボボックスを含む.NET 3.5 Winフォームを有するSchemeType

両方の主キーへの外部キーを含みます。
一つは、私は他の希望Schemes
その選択SchemeためSchemeTypeテーブルに存在する異なるTypesを表示するように表示します。

私はDataSetを持っています。このテーブルには、すべての3つのテーブルのすべてのエントリが含まれており、プライマリ - 外部キー関係のDataRelationsが設定されています。

BindingSourcesを使用してコンボボックスを作成していますが、Schemeコンボボックスを変更したときに、Typeコンボボックスにコンテンツをリフレッシュする方法を見つけることができません。

私はまっすぐな親子関係でこれを行うことができますが、親子関係をコーディングする仕方はできません。その中に少なくとも1項目があるはずにもかかわらず、不必要なものは、

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 

タイプのコンボボックスは、すべての項目が含まれていませんが取り除かで
はここで、私のコードです。 DataRelationを交換すると、このケースでは親(SchemeType)にTypeIDの一意のエントリがないため、DataSetにDataRelationを追加しません。

誰でも助けてくれますか?

答えて

0

データバインディングを使用して自動的に達成するわけではありません。データバインディングでは、選択した親に基づいて子リストをフィルタリングすることができるため、選択したSchemeに基づいてSchemeTypeリストを自動的にフィルタリングすることができます。あなたが望むのは、すべての親のTypeレコードを取得することです。データバインディングはそれらの子レコードに基づいています。それは手動で行う必要があります。通常どおり

は親 BindingSourceを通じて DataRelationにバインドされた子 BindingSourceで、親と子として BindingSource秒にご SchemeSchemeTypeテーブルをバインドし

Schemeが選択され、子供のBindingSourceが自動的にフィルタリングされたら、ループしてTypeレコードのすべてのIDを取得し、Filterの値を第3のBindingSourceに設定することができます。

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

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

ありがとうございます。私は手動でなければならないのではないかと心配していましたが、私が行方不明になっていた自動化された方法がないことを確認したかったのです。 SQLDataAdapter.Updateプロセスを使用できるように、各コンボの選択された値をバインドすることはできません。 –

+0

私は、テストをせずにどのような影響が出るかを100%確信していません。フィルターと更新の両方にバインディングを使用できるかどうかはわかりません。 – jmcilhinney

関連する問題