abhängige Comboboxen

09/05/2010 - 18:36 von Papa | Report spam
Hallo NG
ich stehe vor dem folgenden Problem und komme nicht mehr weiter.

In einer Datenbank(Access) habe ich die Tabellen

Lànder
Bundeslànder
Hauptstadt
mit den entsprechenden Datensàtzen.

Nun soll nach der Auswahl der Combobox 1(Land) in der Combobox 2
(Bundesland) usw. angezeigt werden.

leider gelingt mir dies mit meinem Code nicht.

Es werden nach dem Auswàhlen in Combobox 1 immer alle Bundeslànder in
Combobox 2 angezeigt, also auch Österreich und Schweiz.
Ich wollte aber erreichen das bei Auswahl von Deutschland nur die deutschen
und bei Auswahl der Schweiz nur deren Kantone in der Combobox 2 angezeigt
werden.

Was mach ich falsch.

hier mein Code:

Imports System.Data.OleDb

Public Class Form1
Private conn As OleDbConnection = Nothing
Private daLA As OleDbDataAdapter = Nothing
Private daBL As OleDbDataAdapter = Nothing
Private daSt As OleDbDataAdapter = Nothing
Private ds As DataSet = Nothing

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

Dim Daten As String
Daten = Application.StartupPath & "\Daten.mdb"

conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" & Daten)
daLA = New OleDbDataAdapter("SELECT ID, Land FROM Laender ORDER BY
Land", conn)
daBL = New OleDbDataAdapter("SELECT ID, LandID, BL FROM
Bundeslaender", conn)
daSt = New OleDbDataAdapter("SELECT ID, Stadt FROM Hauptstadt",
conn)

ds = New DataSet

Try
conn.Open()
daLA.Fill(ds, "Laender")
daBL.Fill(ds, "Bundeslaender")
daSt.Fill(ds, "Hauptstadt")
conn.Close()

Dim dt As New DataTable

Me.BindingSource1.DataSource = New
DataView(ds.Tables("Laender"))
Me.ComboBox1.DisplayMember = "Land"
Me.ComboBox1.ValueMember = "ID"
Me.ComboBox1.DataSource = Me.BindingSource1

Me.BindingSource2.DataSource = New
DataView(ds.Tables("Bundeslaender"))
Me.ComboBox2.DisplayMember = "BL"
Me.ComboBox2.ValueMember = "LandID"
Me.ComboBox2.DataSource = Me.BindingSource2
Me.ComboBox2.DataBindings.Add("SelectedValue", BindingSource1,
"ID")

Me.BindingSource3.DataSource = New
DataView(ds.Tables("Hauptstadt"))
Me.ComboBox3.DisplayMember = "Stadt"
Me.ComboBox3.ValueMember = "ID"
Me.ComboBox3.DataSource = Me.BindingSource3

Catch ex As Exception
MessageBox.Show(ex.Message, "Fehler")
End Try
End Sub

Gruß Rudi
 

Lesen sie die antworten

#1 Peter Götz
10/05/2010 - 10:20 | Warnen spam
Hallo Rudi,

"Papa" schrieb im Newsbeitrag
news:
Hallo NG
ich stehe vor dem folgenden Problem und komme nicht mehr weiter.

In einer Datenbank(Access) habe ich die Tabellen

Lànder
Bundeslànder
Hauptstadt
mit den entsprechenden Datensàtzen.

Nun soll nach der Auswahl der Combobox 1(Land) in der Combobox 2
(Bundesland) usw. angezeigt werden.

leider gelingt mir dies mit meinem Code nicht.

Es werden nach dem Auswàhlen in Combobox 1 immer alle Bundeslànder in
Combobox 2 angezeigt, also auch Österreich und Schweiz.
Ich wollte aber erreichen das bei Auswahl von Deutschland nur die
deutschen und bei Auswahl der Schweiz nur deren Kantone in der Combobox 2
angezeigt werden.

Was mach ich falsch.

hier mein Code:

Imports System.Data.OleDb

Public Class Form1
Private conn As OleDbConnection = Nothing
Private daLA As OleDbDataAdapter = Nothing
Private daBL As OleDbDataAdapter = Nothing
Private daSt As OleDbDataAdapter = Nothing
Private ds As DataSet = Nothing

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

Dim Daten As String
Daten = Application.StartupPath & "\Daten.mdb"

conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" & Daten)
daLA = New OleDbDataAdapter("SELECT ID, Land FROM Laender ORDER BY
Land", conn)



Mit dem vorstehenden Select-Statemen holst Du Dir
also erst mal alle Lànder aus Deiner DB.



daBL = New OleDbDataAdapter("SELECT ID, LandID, BL FROM
Bundeslaender", conn)



Damit bekommst Du alle Bundeslànder aller Lànder.
Wenn Du nur die Bundeslànder eines bestimmten Landes
haben willst, dann musst Du Dein Select-Statement um
eine Where-Klausel erweitern:

"Select ID, LandID, BL From Bundeslaender " &
"Where LandID = 123


Wenn Du wie bei Deinen Select-Statements jeweils den gesamten
Tabelleninhalt der Tabelle Bundeslaender in eine DataTable einliest,
dann kannst Du aus dieser die Bundeslànder eines bestimmten
Landes via .RowStateFilter ausselektieren.
Das entspràche dann dem folgenden Beispiel:

' /// Code in einem leeren Formmodul (Form1.vb)
Public Class Form1
Private mDTmaster As DataTable
Private mDVmaster As DataView

Private mDTslave As DataTable
Private mDVslave As DataView

Private WithEvents cboMaster As ComboBox
Private WithEvents lstSlave As ListBox

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

CreateData()
CreateControls()

lstSlave.DataSource = mDVslave

lstSlave.DisplayMember = _
mDTslave.Columns(2).ColumnName

cboMaster.DisplayMember = "Gruppe"
cboMaster.ValueMember = "ID"
cboMaster.DataSource = mDVmaster

End Sub


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

' *** RowStateFilter setzen ***********************

mDVslave.RowFilter = _
"ID = " & cboMaster.SelectedValue.ToString


' *****************************************************
End Sub

Private Sub CreateControls()
cboMaster = New ComboBox
With cboMaster

.DropDownStyle = _
ComboBoxStyle.DropDownList

.Font = New Font("Arial", 14)

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

.Anchor = _
AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right
End With
Me.Controls.Add(cboMaster)

Dim Top As Integer = cboMaster.Bottom + 20
lstSlave = New ListBox
With lstSlave
.Font = New Font("Arial", 12)

.SetBounds _
(10, Top, _
cboMaster.Width, _
Me.ClientSize.Height - Top - 10)

.IntegralHeight = False

.Anchor = _
AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right Or _
AnchorStyles.Bottom
End With
Me.Controls.Add(lstSlave)

End Sub

Private Sub CreateData()
Dim i As Integer
Dim k As Integer
Dim DR As DataRow

Dim Gruppen() As String = _
{"Obst", "Gemüse", "Milchprodukte"}

Dim Obst() As String = _
{"Äpfel", "Birnen", "Trauben", "Beeren"}

Dim Gemuese() As String = _
{"Salat", "Rotkohl", "Rettich", "Spargel", "Spinat"}

Dim Milchprodukte() As String = _
{"Milch", "Butter", "Kàse", "Sahne"}

Dim Artikel() = {Obst, Gemuese, Milchprodukte}

mDTmaster = New DataTable
With mDTmaster
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Gruppe", GetType(String))
.TableName = "mDTmaster"
For i = 0 To Gruppen.GetUpperBound(0)
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = Gruppen(i)
.Rows.Add(DR)
Next
.AcceptChanges()
End With

Dim P() As String
mDTslave = New DataTable
With mDTslave
.Columns.Add("ID", GetType(Integer))
.Columns.Add("GID", GetType(String))
.Columns.Add("Aritkel", GetType(String))
.TableName = "mDTslave"
For i = 0 To Artikel.GetUpperBound(0)
P = Artikel(i)
For k = 0 To P.GetUpperBound(0)
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = k
DR.Item(2) = P(k)
.Rows.Add(DR)
Next
.AcceptChanges()
Next
End With

mDVmaster = New DataView(mDTmaster)
mDVslave = New DataView(mDTslave)
End Sub

End Class
' \\\ E N T E

Nach dem Programmstart siehst Du in der ComboBox
die in der Mastertabelle mDTmaster enthaltenen Gruppen.
Bei jedem Wechsel der Gruppe in der ComboBox werden
aus der Detailtabelle bzw. der zugehörigen DataView
(mDVslave) nur die zur gewàhlten Gruppe gehörenden
Artikel herausgefiltert.

Mehr zu solchen Master-Detail-Darstellungen findest Du
unter

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

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

Ähnliche fragen