none
BindingSource DataMember -> Daten ändern... RRS feed

  • Frage

  • Hallo Ich stehe gerade total am Schlauch... - Bitte um eure Hilfe Folgende Situation: Ich habe Hierachsiche Daten. Eine BindingSource.DataSource ist an die Datenquelle gebunden. Die zweite BindingSource hat als DataSource die erste BindingSource und als DataMember die "Child-Table" Wenn ich mein Grid ansehe, werden die Daten korrekt angezeigt (also ich sehe die Child Tabelle Wenn ich jetzt händisch versuche eine Zeile hinzuzufügen, dann bekomme ich den Fehler, dass die Konvertierung nicht stimmt, da das BindingSource.AddNew eine Zeile vom Type Master-Tabelle erwartet und nicht die Child-Tabelle. Klingt für mich auf eine Art & Weise logisch, da ja die DataSource selbst von der ersten BindingSource stammt, die ja auch an die Master-Tabelle gebunden ist. - Aber wie füge ich dann in diesem Fall eine Child-Tabelle-Zeile in die 2. BindingSource korrekt ein? Hoffe Ihr versteht was ich meine.... DANKE
    Sonntag, 1. Mai 2011 09:28

Antworten

  • Hier mal eine kleine Demo, wie das problemlos funktioniert; einfach in den Codeteil eines Formulars einer neuen VB Windows Forms Anwendung kopieren:
     
    Public Class Form1
     
      Dim sc As New SplitContainer With {.Dock = DockStyle.Fill}
      Dim dgv1 As New DataGridView With {.Dock = DockStyle.Fill}
      Dim dgv2 As New DataGridView With {.Dock = DockStyle.Fill}
     
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(sc)
        sc.Panel1.Controls.Add(dgv1)
        sc.Panel2.Controls.Add(dgv2)
     
        dgv1.DataSource = TestData.BS1
        dgv2.DataSource = TestData.BS2
     
      End Sub
     
      Class TestData
        Public Shared BS1 As BindingSource
        Public Shared BS2 As BindingSource
        Shared Sub New()
          Dim ds As New DataSet
          ds.Tables.Add(New DataTable)
          ds.Tables.Add(New DataTable)
          With ds.Tables(0)
            With .Columns.Add("ID", GetType(Integer))
              ..AutoIncrement = True
              ..AutoIncrementSeed = -1
              ..AutoIncrementStep = -1
            End With
            .Columns.Add("col1", GetType(String))
          End With
          With ds.Tables(1)
            With .Columns.Add("ID", GetType(Integer))
              ..AutoIncrement = True
              ..AutoIncrementSeed = -1
              ..AutoIncrementStep = -1
            End With
            .Columns.Add("FK", GetType(Integer))
            .Columns.Add("col1", GetType(String))
          End With
          ds.Relations.Add(New DataRelation("rel1", ds.Tables(0).Columns(0), ds.Tables(1).Columns(1)))
          For i = 1 To 10
            Dim r1 = ds.Tables(0).NewRow
            r1(1) = "Zeile " & i.ToString
            ds.Tables(0).Rows.Add(r1)
            For k = 1 To 5
              Dim r2 = ds.Tables(1).NewRow
              r2(1) = r1(0)
              r2(2) = "Zeile " & i.ToString & " " & k.ToString
              ds.Tables(1).Rows.Add(r2)
            Next
          Next
          BS1 = New BindingSource(ds.Tables(0), "")
          BS2 = New BindingSource(BS1, "rel1")
        End Sub
      End Class
     
    End Class
     
    --
    Viele Grüße
    Peter
    • Als Antwort markiert Zero-G. _ Montag, 2. Mai 2011 05:14
    Sonntag, 1. Mai 2011 17:50

Alle Antworten

  • Hier mal eine kleine Demo, wie das problemlos funktioniert; einfach in den Codeteil eines Formulars einer neuen VB Windows Forms Anwendung kopieren:
     
    Public Class Form1
     
      Dim sc As New SplitContainer With {.Dock = DockStyle.Fill}
      Dim dgv1 As New DataGridView With {.Dock = DockStyle.Fill}
      Dim dgv2 As New DataGridView With {.Dock = DockStyle.Fill}
     
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(sc)
        sc.Panel1.Controls.Add(dgv1)
        sc.Panel2.Controls.Add(dgv2)
     
        dgv1.DataSource = TestData.BS1
        dgv2.DataSource = TestData.BS2
     
      End Sub
     
      Class TestData
        Public Shared BS1 As BindingSource
        Public Shared BS2 As BindingSource
        Shared Sub New()
          Dim ds As New DataSet
          ds.Tables.Add(New DataTable)
          ds.Tables.Add(New DataTable)
          With ds.Tables(0)
            With .Columns.Add("ID", GetType(Integer))
              ..AutoIncrement = True
              ..AutoIncrementSeed = -1
              ..AutoIncrementStep = -1
            End With
            .Columns.Add("col1", GetType(String))
          End With
          With ds.Tables(1)
            With .Columns.Add("ID", GetType(Integer))
              ..AutoIncrement = True
              ..AutoIncrementSeed = -1
              ..AutoIncrementStep = -1
            End With
            .Columns.Add("FK", GetType(Integer))
            .Columns.Add("col1", GetType(String))
          End With
          ds.Relations.Add(New DataRelation("rel1", ds.Tables(0).Columns(0), ds.Tables(1).Columns(1)))
          For i = 1 To 10
            Dim r1 = ds.Tables(0).NewRow
            r1(1) = "Zeile " & i.ToString
            ds.Tables(0).Rows.Add(r1)
            For k = 1 To 5
              Dim r2 = ds.Tables(1).NewRow
              r2(1) = r1(0)
              r2(2) = "Zeile " & i.ToString & " " & k.ToString
              ds.Tables(1).Rows.Add(r2)
            Next
          Next
          BS1 = New BindingSource(ds.Tables(0), "")
          BS2 = New BindingSource(BS1, "rel1")
        End Sub
      End Class
     
    End Class
     
    --
    Viele Grüße
    Peter
    • Als Antwort markiert Zero-G. _ Montag, 2. Mai 2011 05:14
    Sonntag, 1. Mai 2011 17:50
  • Guten Morgen!

    Danke für Dein explizites Beispiel!

    Hat mir geholfen!

     

    Montag, 2. Mai 2011 05:14