2016-05-06 14 views
0

Ich habe mich umgesehen, und kann nicht ganz finden, was ich brauche.Bind Combobox zu Parent DataRelation und aktualisieren, wenn 2. Elternteil ändert

Ich habe einen DB mit (neben anderen) 3 Tabellen.
SchemeType
Scheme
Type

SchemeType enthält Fremdschlüssel zu den Primärschlüssel und sowohl SchemeType

I haben eine 2 Comboboxen NET 3.5 WinForm enthält.
One zeigt die Schemes
ich die andere möchte die deutliche Types, die für die ausgewählten Scheme in der SchemeType Tabelle vorhanden angezeigt werden soll.

Ich habe eine DataSet, die alle Einträge für alle 3 Tabellen enthält und DataRelations für die Primary-Foreign-Schlüsselbeziehungen eingerichtet haben.

Ich verwende BindingSources, um die Comboboxes zu füllen, aber kann nicht herausfinden, wie die Type Combobox zum Aktualisieren der Inhalte erhalten, wenn ich die Scheme Combobox ändern.

Ich kann dies mit einer geraden Eltern-Kind-Beziehung tun, aber kann nicht herausfinden, wie die Eltern-Kind-Eltern-Beziehung zu kodieren.
Hier ist mein Code, mit unnötigen Sachen

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 

Der Typ Combobox alle Elemente enthält nicht gezupft, obwohl es in mindestens 1 Punkt sein sollte. Wenn ich die DataRelation austausche, wird sie dem DataSet nicht hinzugefügt, da das Elternelement in diesem Fall (SchemeType) keine eindeutigen Einträge für TypeID hat.

Kann mir bitte jemand helfen?

Antwort

0

Dies wird nicht automatisch durch Datenbindung erreicht. Die Datenbindung kann das Filtern einer untergeordneten Liste basierend auf einem ausgewählten übergeordneten Element verarbeiten, sodass Sie die SchemeType-Liste basierend auf der ausgewählten Scheme automatisch filtern lassen können. Was Sie dann wollen, ist, alle Eltern Type Datensätze basierend auf diesen untergeordneten Datensätzen zu erhalten, die Datenbindung nicht tun. Das muss manuell sein.

Ihre Scheme und SchemeType Tabellen BindingSource s als Eltern und Kind wie gewohnt, mit dem Kind binden BindingSourceBindingSource zum DataRelation durch die Eltern gebunden. Sobald die Scheme ausgewählt ist und das Kind BindingSource automatisch filtert, können Sie es durchlaufen, um alle IDs für die Type Datensätze zu erhalten und verwenden, um einen Filter Wert für eine dritte BindingSource, z.

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

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

Ah, danke. Ich hatte Angst, dass es manuell sein müsste, aber ich wollte überprüfen, dass es keinen automatischen Weg gab, den ich vermisst habe. Bin ich richtig, dass ich nicht in der Lage bin, die ausgewählten Werte jeder Kombination zu binden, um den Prozess SQLDataAdapter.Update verwenden zu können? –

+0

Ich bin nicht 100% sicher, was die Auswirkungen wären, ohne zu testen. Ich bin mir nicht sicher, ob Sie die Bindung sowohl zum Filtern als auch zum Aktualisieren verwenden könnten. – jmcilhinney