none
XML an ComboBoxen anbinden RRS feed

  • Frage

  • Hallo zusammen,

    ich habe mir eine XML Datei erstellt und möchte diese an 2 ComboBoxen binden.

    Inhalt der XML Datei:

    <?xml version="1.0" encoding="utf-8" ?> 
    <ComboBox>
    	<language id = "de-DE">
    		<inhalt Code="0" Beschreibung="Eintrag 1" />
    		<inhalt Code="1" Beschreibung="Eintrag 2" />
    		<inhalt Code="2" Beschreibung="Eintrag 3" >
    			<inhalt1 Code="0" Beschreibung="Untereintrag 1" />
    			<inhalt1 Code="1" Beschreibung="Untereintrag 2" />
    			<inhalt1 Code="2" Beschreibung="Untereintrag 3" />
    		</inhalt>
    		<inhalt Code="3" Beschreibung="Eintrag 4" />
    	</language>
    	<language id = "en-US">
    		<inhalt Code="0" Beschreibung="Eintrag 1" />
    		<inhalt Code="1" Beschreibung="Eintrag 2" />
    		<inhalt Code="2" Beschreibung="Eintrag 3" >
    			<inhalt1 Code="0" Beschreibung="Untereintrag 1" />
    			<inhalt1 Code="1" Beschreibung="Untereintrag 2" />
    			<inhalt1 Code="2" Beschreibung="Untereintrag 3" />
    		</inhalt>
    		<inhalt Code="3" Beschreibung="Eintrag 4" />
    	</language>
    </ComboBox>
    

    Die Sprach ID hole ich mir aus: Threading.Thread.CurrentThread.CurrentCulture.ToString

    Ich hatte mir ein DataSet erzeugt und mit .ReadXml die Datei eingelesen. Da habe ich aber festgestellt, dass mir 3 Tabellen erzeugt wurden.

    Tabelle1: de-DE; en-US

    Tabelle2: Eintrag 1; Eintrag 2; Eintrag 3; Eintrag 4; Eintrag 1; Eintrag 2; Eintrag 3; Eintrag 4

    Tabelle3: Untereintrag 1; Untereintrag 2; Untereintrag 3; Untereintrag 1; Untereintrag 2; Untereintrag 3;

    Aber wie binde ich den inhalt an ComboBox1 und den inhalt1 an ComboBox2 an?

    Ich möchte, dass wenn Eintrag 3 ausgewählt wird die ComboBox2 mit Untereintrag 1 + 2 +3 gefüllt wird?

    Geht dies überhaupt oder muss ich es anders lösen?

    Ich verwende .NET 2.0 für dieses Programm.

    Vielen Dank für Euche Hilfe.

    Mike

     

    Samstag, 2. Oktober 2010 08:31

Antworten

  • Hallo Mike,

    wenn ich es recht verstehe ist Dein Problem die log.
    Verknupfung zweier DataTables (Master / Detail).

    Hier mal ein einfaches Beispiel mit einer Combobox (Master)
    und einer ListBox (Detail).

    Mit jeder Auswahl in der ComboBox (Master) werden in der
    darunter liegenden Listbox die zur Auswahl gehörenden
    Detaildatensätze angezeigt.

    Kopiere den nachfolgenden Code in ein leeres Formmodul (Form1.vb)

    ' / / / Code in Formmodul Form1.vb
    Public Class Form1
        Private WithEvents cboMaster As ComboBox
        Private WithEvents lstDetail As ListBox

        Private mDS As DataSet

        Private mDTmaster As DataTable
        Private mDVmaster As DataView
        'Private WithEvents mCMmaster As CurrencyManager

        Private mDTdetail As DataTable
        Private mDVdetail As DataView

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                ) Handles MyBase.Load

            CreateControls()
            CreateData()

            With cboMaster
                .DataSource = mDVmaster

                .DisplayMember = _
                        mDTmaster.Columns(1).ColumnName

                .ValueMember = _
                        mDTmaster.Columns(0).ColumnName
            End With

        End Sub

        Private Sub CreateControls()
            Dim Fnt As New Font("Arial", 12)

            cboMaster = New ComboBox
            With cboMaster
                .Name = "cboMaster"
                .Font = Fnt

                .SetBounds _
                        (10, 15, _
                         Me.ClientSize.Width - 20, _
                         .Height)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right

                .DropDownStyle = _
                        ComboBoxStyle.DropDownList

            End With
            Me.Controls.Add(cboMaster)

            lstDetail = New ListBox
            With lstDetail
                .Name = "lstDetail"
                .Font = Fnt

                .SetBounds _
                        (10, _
                         cboMaster.Bottom + 15, _
                         cboMaster.Width, _
                         Me.ClientSize.Height - (cboMaster.Bottom + 20))

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

            End With
            Me.Controls.Add(lstDetail)

        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim k As Integer
            Dim DR As DataRow
            'Dim DC As DataColumn
            Dim Animals As New List(Of String())
            Dim Buffer() As String

            mDS = New DataSet("mDS")

            Dim Groups() As String = _
                    New String() _
                    {"Säugetier", "Vogel", "Fisch", "Insekt"}

            Animals.Add _
                (New String() _
                 {"Hund", "Katze", "Maus"})

            Animals.Add _
                     (New String() _
                     {"Adler", "Dohle", "Schwalbe", "Elster"})

            Animals.Add _
                    (New String() _
                    {"Karpfen", "Hering", "Makrele", "Dorsch"})

            Animals.Add _
                    (New String() _
                    {"Fliege", "Stechmücke", "Hummel", "Biene"})

            mDTdetail = New DataTable
            With mDTdetail
                .TableName = "mDTdetail"
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("FKey", GetType(Integer))
                .Columns.Add("Tier", GetType(String))
            End With

            ' Primärschlüssel für mDTdetail über zwei Felder (ID u. FKey)
            Dim Cols(1) As DataColumn
            Cols(0) = mDTdetail.Columns(0)
            Cols(1) = mDTdetail.Columns(1)

            Dim UC As UniqueConstraint = _
                    New UniqueConstraint("PKd", Cols)

            mDTdetail.Constraints.Add(UC)

            mDTmaster = New DataTable
            With mDTmaster
                .TableName = "mDTmaster"
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("Gruppe", GetType(String))

                For i = 0 To Groups.GetUpperBound(0)
                    DR = .NewRow
                    DR.Item("ID") = i
                    DR.Item("Gruppe") = Groups(i)
                    .Rows.Add(DR)

                    Buffer = Animals(i)
                    For k = 0 To Buffer.GetUpperBound(0)
                        DR = mDTdetail.NewRow
                        DR.Item("ID") = k
                        DR.Item("FKey") = i
                        DR.Item("Tier") = Buffer(k)
                        mDTdetail.Rows.Add(DR)
                    Next
                    mDTdetail.AcceptChanges()
                Next
                .AcceptChanges()
            End With
            ' Primärschlüssel für mDTMaster (Feld ID)
            mDTmaster.Constraints.Add _
                    (New UniqueConstraint _
                     ("PKm", mDTmaster.Columns("ID"), True))

            mDS.Tables.Add(mDTmaster)
            mDS.Tables.Add(mDTdetail)

            mDS.Relations.Add _
                    ("RelMD", _
                     mDTmaster.Columns("ID"), _
                     mDTdetail.Columns("FKey"), _
                     True)

            mDVmaster = mDTmaster.DefaultView

        End Sub

        Private Sub cboMaster_SelectedIndexChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles cboMaster.SelectedIndexChanged

            Dim DRV As DataRowView

            DRV = DirectCast(cboMaster.SelectedItem, DataRowView)

            mDVdetail = DRV.CreateChildView(mDS.Relations("RelMD"))
            lstDetail.DataSource = mDVdetail
            With lstDetail
                .DataSource = mDVdetail
                .DisplayMember = mDTdetail.Columns(2).ColumnName
            End With
        End Sub
    End Class
    ' \ \ \  E N T E

    Nach dem Programmstart siehst Du die Form1 mit einer
    ComboBox und einer darunter angeordneten Listbox.
    Nach Auswahl eines Eintrages in der ComboBox werden
    in der Listbox die zugehörigen Details sichtbar.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Samstag, 2. Oktober 2010 11:40
  • Hallo Mike,

    danke für Deine Antwort.

    Ich habe aber keine Möglichkeit diese Tabellen zu verknüpfen.

    Grundsätzlich kannst Du zwischen beliebigen DataTables in Deinem
    DataSet log. Beziehungen via Relation herstellen, sofern diese
    DataTables Felder, die als Primärschlüssel definiert sind bzw.
    dazu korrespondierende Fremdschlüssel besitzen. Bei Deinem
    Tabellenlayout ist das allerdings nicht der Fall.

    Im Beispiel unter

        www.gssg.de -> Visual Basic -> VB.net
            -> DataGridView
                -> DataGridView Relation 3

    werden drei Tabellen (DataTables) via Relation in Beziehung
    gesetzt.
    Die oberste DataTable entpräche Deiner Auswahl de-DE bzw
    en-US. Die zweite (mittlere) DataTable entspräche dann Deiner
    Tabelle1 und die dritte (unterste) DataTable entspräche Deiner
    Tabelle2.
    Im genannten Beispiel kannst Du Dir ansehen, wie die Tabellen
    über Primärschlüssel bzw. Fremdschlüssel mit Hilfe von zwei
    Relation-Objekten verknüpft sind.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Sonntag, 3. Oktober 2010 16:05
  • Hallo Peter,

    ich habe es nun direkt unter einer Access Datenbank gelöst. Habe nun dort alle Primär- und Fremschlüssel enthalten und versuche mich jetzt mal Deinem Beispielprogramm DataGridView Relation 3 "nachzubauen".

    Erstmal vielen Dank wieder dafür, dass Du mir geholfen hast.

    Mike

    Dienstag, 5. Oktober 2010 17:52

Alle Antworten

  • Hallo Mike,

     

    lies das XML File in ein DataSet und binde das DataSet an die ComboBox.

    Dim ds as new DataSet

    reader= new StringReader(xml)

    ds.readxml(reader)

    Return ds usw....

     

    Gruss

    Torsten

    Samstag, 2. Oktober 2010 09:33
  • Hallo Torsten,

    dies mache ich ja, aber es kommen in der Auswahl entweder nur die Sprachen oder auch nur die Einträge in deutsch und englisch bzw. die Untereinträge.

    Möchte aber nur in der ComboBox1 haben Eintrag 1, 2 und 3 und auch nur in der korrekten Sprache.

    Gruß

    Mike

    Samstag, 2. Oktober 2010 10:20
  • Hallo Mike,

    wenn ich es recht verstehe ist Dein Problem die log.
    Verknupfung zweier DataTables (Master / Detail).

    Hier mal ein einfaches Beispiel mit einer Combobox (Master)
    und einer ListBox (Detail).

    Mit jeder Auswahl in der ComboBox (Master) werden in der
    darunter liegenden Listbox die zur Auswahl gehörenden
    Detaildatensätze angezeigt.

    Kopiere den nachfolgenden Code in ein leeres Formmodul (Form1.vb)

    ' / / / Code in Formmodul Form1.vb
    Public Class Form1
        Private WithEvents cboMaster As ComboBox
        Private WithEvents lstDetail As ListBox

        Private mDS As DataSet

        Private mDTmaster As DataTable
        Private mDVmaster As DataView
        'Private WithEvents mCMmaster As CurrencyManager

        Private mDTdetail As DataTable
        Private mDVdetail As DataView

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                ) Handles MyBase.Load

            CreateControls()
            CreateData()

            With cboMaster
                .DataSource = mDVmaster

                .DisplayMember = _
                        mDTmaster.Columns(1).ColumnName

                .ValueMember = _
                        mDTmaster.Columns(0).ColumnName
            End With

        End Sub

        Private Sub CreateControls()
            Dim Fnt As New Font("Arial", 12)

            cboMaster = New ComboBox
            With cboMaster
                .Name = "cboMaster"
                .Font = Fnt

                .SetBounds _
                        (10, 15, _
                         Me.ClientSize.Width - 20, _
                         .Height)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right

                .DropDownStyle = _
                        ComboBoxStyle.DropDownList

            End With
            Me.Controls.Add(cboMaster)

            lstDetail = New ListBox
            With lstDetail
                .Name = "lstDetail"
                .Font = Fnt

                .SetBounds _
                        (10, _
                         cboMaster.Bottom + 15, _
                         cboMaster.Width, _
                         Me.ClientSize.Height - (cboMaster.Bottom + 20))

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

            End With
            Me.Controls.Add(lstDetail)

        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim k As Integer
            Dim DR As DataRow
            'Dim DC As DataColumn
            Dim Animals As New List(Of String())
            Dim Buffer() As String

            mDS = New DataSet("mDS")

            Dim Groups() As String = _
                    New String() _
                    {"Säugetier", "Vogel", "Fisch", "Insekt"}

            Animals.Add _
                (New String() _
                 {"Hund", "Katze", "Maus"})

            Animals.Add _
                     (New String() _
                     {"Adler", "Dohle", "Schwalbe", "Elster"})

            Animals.Add _
                    (New String() _
                    {"Karpfen", "Hering", "Makrele", "Dorsch"})

            Animals.Add _
                    (New String() _
                    {"Fliege", "Stechmücke", "Hummel", "Biene"})

            mDTdetail = New DataTable
            With mDTdetail
                .TableName = "mDTdetail"
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("FKey", GetType(Integer))
                .Columns.Add("Tier", GetType(String))
            End With

            ' Primärschlüssel für mDTdetail über zwei Felder (ID u. FKey)
            Dim Cols(1) As DataColumn
            Cols(0) = mDTdetail.Columns(0)
            Cols(1) = mDTdetail.Columns(1)

            Dim UC As UniqueConstraint = _
                    New UniqueConstraint("PKd", Cols)

            mDTdetail.Constraints.Add(UC)

            mDTmaster = New DataTable
            With mDTmaster
                .TableName = "mDTmaster"
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("Gruppe", GetType(String))

                For i = 0 To Groups.GetUpperBound(0)
                    DR = .NewRow
                    DR.Item("ID") = i
                    DR.Item("Gruppe") = Groups(i)
                    .Rows.Add(DR)

                    Buffer = Animals(i)
                    For k = 0 To Buffer.GetUpperBound(0)
                        DR = mDTdetail.NewRow
                        DR.Item("ID") = k
                        DR.Item("FKey") = i
                        DR.Item("Tier") = Buffer(k)
                        mDTdetail.Rows.Add(DR)
                    Next
                    mDTdetail.AcceptChanges()
                Next
                .AcceptChanges()
            End With
            ' Primärschlüssel für mDTMaster (Feld ID)
            mDTmaster.Constraints.Add _
                    (New UniqueConstraint _
                     ("PKm", mDTmaster.Columns("ID"), True))

            mDS.Tables.Add(mDTmaster)
            mDS.Tables.Add(mDTdetail)

            mDS.Relations.Add _
                    ("RelMD", _
                     mDTmaster.Columns("ID"), _
                     mDTdetail.Columns("FKey"), _
                     True)

            mDVmaster = mDTmaster.DefaultView

        End Sub

        Private Sub cboMaster_SelectedIndexChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles cboMaster.SelectedIndexChanged

            Dim DRV As DataRowView

            DRV = DirectCast(cboMaster.SelectedItem, DataRowView)

            mDVdetail = DRV.CreateChildView(mDS.Relations("RelMD"))
            lstDetail.DataSource = mDVdetail
            With lstDetail
                .DataSource = mDVdetail
                .DisplayMember = mDTdetail.Columns(2).ColumnName
            End With
        End Sub
    End Class
    ' \ \ \  E N T E

    Nach dem Programmstart siehst Du die Form1 mit einer
    ComboBox und einer darunter angeordneten Listbox.
    Nach Auswahl eines Eintrages in der ComboBox werden
    in der Listbox die zugehörigen Details sichtbar.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Samstag, 2. Oktober 2010 11:40
  • Hallo Peter,

    danke für Deine Antwort.

    Ich habe aber keine Möglichkeit diese Tabellen zu verknüpfen.

    Tabelle1

    de-DE

    en-US

    Tabelle 2

    0 | Eintrag 1

    1 | Eintrag 2

    2 | Eintrag 3

    0 | Eintrag 1

    1 | Eintrag 2

    2 | Eintrag 3

    Tabelle 3

    0 | Untereintrag 1

    1 | Untereintrag 2

    2 | Untereintrag 3

    0 | Untereintrag 1

    1 | Untereintrag 2

    2 | Untereintrag 3

    Sollte ich die Systemsprache DE haben, dann wird in der ComboBox1 angezeigt (Eintrag 1; Eintrag 2; Eintrag 3) und wenn ich nun in der ComboBox1 den Eintrag "Eintrag 3" aufrufe wird in der ComboBox2 (Untereintrag 1; Untereintrag 2; Untereintrag 3) angezeigt.

    Ich dachte folgendes: suche in der XML den ausgewählten Eintrag und schaue ob Einträge unter diesem sind, wenn ja zeige mir diese in der ComboBox2 an.

    Mike

     

     

    Samstag, 2. Oktober 2010 15:22
  • Hallo Mike,

    danke für Deine Antwort.

    Ich habe aber keine Möglichkeit diese Tabellen zu verknüpfen.

    Grundsätzlich kannst Du zwischen beliebigen DataTables in Deinem
    DataSet log. Beziehungen via Relation herstellen, sofern diese
    DataTables Felder, die als Primärschlüssel definiert sind bzw.
    dazu korrespondierende Fremdschlüssel besitzen. Bei Deinem
    Tabellenlayout ist das allerdings nicht der Fall.

    Im Beispiel unter

        www.gssg.de -> Visual Basic -> VB.net
            -> DataGridView
                -> DataGridView Relation 3

    werden drei Tabellen (DataTables) via Relation in Beziehung
    gesetzt.
    Die oberste DataTable entpräche Deiner Auswahl de-DE bzw
    en-US. Die zweite (mittlere) DataTable entspräche dann Deiner
    Tabelle1 und die dritte (unterste) DataTable entspräche Deiner
    Tabelle2.
    Im genannten Beispiel kannst Du Dir ansehen, wie die Tabellen
    über Primärschlüssel bzw. Fremdschlüssel mit Hilfe von zwei
    Relation-Objekten verknüpft sind.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Sonntag, 3. Oktober 2010 16:05
  • Hallo Peter,

    ich habe es nun direkt unter einer Access Datenbank gelöst. Habe nun dort alle Primär- und Fremschlüssel enthalten und versuche mich jetzt mal Deinem Beispielprogramm DataGridView Relation 3 "nachzubauen".

    Erstmal vielen Dank wieder dafür, dass Du mir geholfen hast.

    Mike

    Dienstag, 5. Oktober 2010 17:52