Benutzer mit den meisten Antworten
XML an ComboBoxen anbinden

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
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 ListBoxPrivate mDS As DataSet
Private mDTmaster As DataTable
Private mDVmaster As DataView
'Private WithEvents mCMmaster As CurrencyManagerPrivate mDTdetail As DataTable
Private mDVdetail As DataViewPrivate Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.LoadCreateControls()
CreateData()With cboMaster
.DataSource = mDVmaster.DisplayMember = _
mDTmaster.Columns(1).ColumnName.ValueMember = _
mDTmaster.Columns(0).ColumnName
End WithEnd 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.DropDownListEnd 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.BottomEnd 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 StringmDS = 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.SelectedIndexChangedDim 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 ENach 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)- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 12. Oktober 2010 13:59
-
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 3werden 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)- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 12. Oktober 2010 13:59
-
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
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 12. Oktober 2010 13:59
Alle Antworten
-
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
-
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 ListBoxPrivate mDS As DataSet
Private mDTmaster As DataTable
Private mDVmaster As DataView
'Private WithEvents mCMmaster As CurrencyManagerPrivate mDTdetail As DataTable
Private mDVdetail As DataViewPrivate Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.LoadCreateControls()
CreateData()With cboMaster
.DataSource = mDVmaster.DisplayMember = _
mDTmaster.Columns(1).ColumnName.ValueMember = _
mDTmaster.Columns(0).ColumnName
End WithEnd 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.DropDownListEnd 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.BottomEnd 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 StringmDS = 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.SelectedIndexChangedDim 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 ENach 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)- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 12. Oktober 2010 13:59
-
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
-
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 3werden 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)- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 12. Oktober 2010 13:59
-
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
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 12. Oktober 2010 13:59