none
Datset, 2 Comboboxen, 1 Datagridview und alles miteinander verbinden RRS feed

  • Frage

  • Hi,

    ich versuche gerade 2 Comboboxen und eine Datagridview miteinander zu verbinden. Die beiden Comboxen bekomme ich verbunden (sprich in combobox2 wird nur das angezeigt was zur auswahl in combobox1 pass). Nun soll die Datagridview anzeigen was zur selection in combobox2 passt. Das Dataset wird mit 3 tabellen gefüllt (User, Konten, Buchungen). Combobox1 zeigt die User, Combobox2 die Konten des User, die Datagridview soll die Buchungen zum konto zeigen. Es werden dem Dataset 2 Relationen hinzugefügt: relation_User_Konten und relation_Konten_Buchungen). Es werden die BindingSourcen hinzugefügt (und da glaube ich liegt der fehler). hier mal der code

          

     Dim conn As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Haushaltsbuch.accdb")
    
        Dim cmd As New OleDb.OleDbCommand("Select * from Users", conn)
        Dim adapterUsers As New OleDb.OleDbDataAdapter(cmd)
        Dim cbUsers As New OleDb.OleDbCommandBuilder(adapterUsers)
    
        Dim adapterKonten As New OleDb.OleDbDataAdapter("select * from Konten", conn)
        Dim cbKonten As New OleDb.OleDbCommandBuilder(adapterKonten)
    
        Dim adapterBuchungen As New OleDb.OleDbDataAdapter("select * from Buchungen", conn)
        Dim cbBuchungen As New OleDb.OleDbCommandBuilder(adapterBuchungen)
    
        Dim ds As New DataSet()
    
        ds.Tables.Add("Users")
        adapterUsers.Fill(ds, "Users")
        ds.Tables.Add("Konten")
        adapterKonten.Fill(ds, "Konten")
        ds.Tables.Add("Buchungen")
        adapterBuchungen.Fill(ds, "Buchungen")
    
        Dim ParentClmn1, ChildClmn1 As New DataColumn()
        'Get the reference of columns to create a relation between.
        ParentClmn1 = ds.Tables("Users").Columns("ID_User")
        ChildClmn1 = ds.Tables("Konten").Columns("ID_User")
        'Creates a relation object, Parameters required are
        'New Relation Name, Object of Parent & Child column respectively.
        Dim DataRelation1 As New DataRelation("relation_User_Konten", ParentClmn1, ChildClmn1)
        'Adding Relation to the dataset that holds the tables.
        ds.Relations.Add(DataRelation1)
    
        Dim bsUsers As New BindingSource
        bsUsers.DataSource = ds
        bsUsers.DataMember = "Users"
        bsUsers.Sort = "Nname"
    
        cmbUsers.DataSource = bsUsers
        cmbUsers.DisplayMember = "Nname"
    
        Dim bsKonten As New BindingSource
        bsKonten.DataSource = bsUsers
        bsKonten.DataMember = "relation_User_Konten"
    
        cmbKonten.DataSource = bsKonten
        cmbKonten.DisplayMember = "KtoNr"
    
        Dim ParentClmn2, ChildClmn2 As New DataColumn()
        'Get the reference of columns to create a relation between.
        ParentClmn2 = ds.Tables("Konten").Columns("ID_Kto")
        ChildClmn2 = ds.Tables("Buchungen").Columns("ID_Kto")
        'Creates a relation object, Parameters required are
        'New Relation Name, Object of Parent & Child column respectively.
        Dim DataRelation2 As New DataRelation("relation_Konten_Buchungen", ParentClmn2, ChildClmn2)
        'Adding Relation to the dataset that holds the tables.
        ds.Relations.Add(DataRelation2)
    
        Dim bsBuchungen As New BindingSource
        bsBuchungen.DataSource = bsKonten
        bsBuchungen.DataMember = "relation_Konten_Buchungen"
    
        dgvBuchungen.DataSource = bsBuchungen


    Danke im Voraus

    Christian

     

    Samstag, 11. Juni 2011 13:26

Antworten

  • Hallo Christian,

    da mir Deine Tabellen-Beschreibung nicht vorliegt, ist das etwas geraten.
    Auffällig ist, dass Du keine ValueMember für die ComboBox setzt.
    Da die Relation zwischen ID_User respektive ID_Kto erstellt wird, sollte die Spalte als ValueMember eingetragen sein.

    Ein älteres Beispiel für die Northwind entsprechend über Customers => Orders => Order Details:

    Imports Microsoft.VisualBasic
    Imports System.Data.SqlClient
    
    Public Class ComboGridForm
    
      Private _formDataSet As DataSet
    
      Private Sub LoadButton_Click(sender As System.Object, e As System.EventArgs) Handles loadButton.Click
        LoadDataSet()
    
        Dim customerBindingSource = New BindingSource(Me._formDataSet, "Customers")
        Dim orderBindingSource = New BindingSource(customerBindingSource, "CustomerOrderRelation")
        Dim orderDetailsBindingSource = New BindingSource(orderBindingSource, "OrderOrderDetailsRelation")
        Me.customerComboBox.DataSource = customerBindingSource
        Me.customerComboBox.DisplayMember = "CompanyName"
        Me.customerComboBox.ValueMember = "CustomerID"
    
        Me.orderComboBox.DataSource = orderBindingSource
        Me.orderComboBox.DisplayMember = "OrderID"
        Me.orderComboBox.ValueMember = "OrderID"
    
        Me.orderDetailDataGridView.DataSource = orderDetailsBindingSource
    
      End Sub
    
      Private Sub LoadDataSet()
        Dim ds As New DataSet("NorthwindDataSet")
    
        Using connection As New SqlConnection(My.Settings.NorthwindConnectionString)
          Dim selectCommand As New SqlCommand( _
            "SELECT * FROM dbo.Customers;" & ControlChars.CrLf & _
            "SELECT * FROM dbo.Orders;" & ControlChars.CrLf & _
            "SELECT * FROM dbo.[Order Details] As OrderDetails;" & ControlChars.CrLf, _
            connection)
    
          Using adapter As New SqlDataAdapter(selectCommand)
            adapter.TableMappings.Add("Table", "Customers")
            adapter.TableMappings.Add("Table1", "Orders")
            adapter.TableMappings.Add("Table2", "OrderDetails")
    
            adapter.MissingMappingAction = MissingMappingAction.Passthrough
            adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
    
            adapter.Fill(ds)
          End Using
        End Using
        ds.Relations.Add("CustomerOrderRelation", _
          ds.Tables("Customers").Columns("CustomerID"), _
          ds.Tables("Orders").Columns("CustomerID"), _
          True)
    
        ds.Relations.Add("OrderOrderDetailsRelation", _
          ds.Tables("Orders").Columns("OrderID"), _
          ds.Tables("OrderDetails").Columns("OrderID"), _
          True)
        Me._formDataSet = ds
      End Sub
    End Class
    
    

    (Das dort verwendete Batch-Laden in einem Rutsch funktioniert bei der Jet nicht!)

    Ich würde Dir empfehlen Dich mit den TableAdapter auseinander zu setzen.
    Denn die DataSets und die dazugehörigen Adapter auf Dauer selbst zu erstellen wird irgendwann nervig ;-)

    Bei größeren Mengen solltest Du zumindest für die Buchungen nur die jeweils benötigten Daten laden -
    sonst platzt das DataSet irgendwann aus allen Nähten.

    Gruß Elmar

     

    Sonntag, 12. Juni 2011 09:29
    Beantworter

Alle Antworten

  • Hallo Christian,

    da mir Deine Tabellen-Beschreibung nicht vorliegt, ist das etwas geraten.
    Auffällig ist, dass Du keine ValueMember für die ComboBox setzt.
    Da die Relation zwischen ID_User respektive ID_Kto erstellt wird, sollte die Spalte als ValueMember eingetragen sein.

    Ein älteres Beispiel für die Northwind entsprechend über Customers => Orders => Order Details:

    Imports Microsoft.VisualBasic
    Imports System.Data.SqlClient
    
    Public Class ComboGridForm
    
      Private _formDataSet As DataSet
    
      Private Sub LoadButton_Click(sender As System.Object, e As System.EventArgs) Handles loadButton.Click
        LoadDataSet()
    
        Dim customerBindingSource = New BindingSource(Me._formDataSet, "Customers")
        Dim orderBindingSource = New BindingSource(customerBindingSource, "CustomerOrderRelation")
        Dim orderDetailsBindingSource = New BindingSource(orderBindingSource, "OrderOrderDetailsRelation")
        Me.customerComboBox.DataSource = customerBindingSource
        Me.customerComboBox.DisplayMember = "CompanyName"
        Me.customerComboBox.ValueMember = "CustomerID"
    
        Me.orderComboBox.DataSource = orderBindingSource
        Me.orderComboBox.DisplayMember = "OrderID"
        Me.orderComboBox.ValueMember = "OrderID"
    
        Me.orderDetailDataGridView.DataSource = orderDetailsBindingSource
    
      End Sub
    
      Private Sub LoadDataSet()
        Dim ds As New DataSet("NorthwindDataSet")
    
        Using connection As New SqlConnection(My.Settings.NorthwindConnectionString)
          Dim selectCommand As New SqlCommand( _
            "SELECT * FROM dbo.Customers;" & ControlChars.CrLf & _
            "SELECT * FROM dbo.Orders;" & ControlChars.CrLf & _
            "SELECT * FROM dbo.[Order Details] As OrderDetails;" & ControlChars.CrLf, _
            connection)
    
          Using adapter As New SqlDataAdapter(selectCommand)
            adapter.TableMappings.Add("Table", "Customers")
            adapter.TableMappings.Add("Table1", "Orders")
            adapter.TableMappings.Add("Table2", "OrderDetails")
    
            adapter.MissingMappingAction = MissingMappingAction.Passthrough
            adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
    
            adapter.Fill(ds)
          End Using
        End Using
        ds.Relations.Add("CustomerOrderRelation", _
          ds.Tables("Customers").Columns("CustomerID"), _
          ds.Tables("Orders").Columns("CustomerID"), _
          True)
    
        ds.Relations.Add("OrderOrderDetailsRelation", _
          ds.Tables("Orders").Columns("OrderID"), _
          ds.Tables("OrderDetails").Columns("OrderID"), _
          True)
        Me._formDataSet = ds
      End Sub
    End Class
    
    

    (Das dort verwendete Batch-Laden in einem Rutsch funktioniert bei der Jet nicht!)

    Ich würde Dir empfehlen Dich mit den TableAdapter auseinander zu setzen.
    Denn die DataSets und die dazugehörigen Adapter auf Dauer selbst zu erstellen wird irgendwann nervig ;-)

    Bei größeren Mengen solltest Du zumindest für die Buchungen nur die jeweils benötigten Daten laden -
    sonst platzt das DataSet irgendwann aus allen Nähten.

    Gruß Elmar

     

    Sonntag, 12. Juni 2011 09:29
    Beantworter
  • Hallo Elmar,

    dein Beitrag war sehr hilfreich, nun klappt alles. Den Comboboxen hatte ich gestern noch die ValueMember gegeben, hatte aber nichts gebracht. Ich habe nun dies Beispiel auf meine Anwendung umgeschrieben und es funktioniert tadellos.

    Guß christian

    MCTS
    Sonntag, 12. Juni 2011 10:59