Mehrere Comboboxen die in Abhängigkeit zueinander stehen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von freefall.

    Mehrere Comboboxen die in Abhängigkeit zueinander stehen

    Hi,
    es geht darum ein Programm zu entwickeln, welches 2 Comboboxen enthält.
    Sobald man in der ersten Liste eine Auswahl getroffen hat, sollen sich die Auswahlmöglichkeiten der zweiten Liste einschränken.

    Beispiel:
    Angenommen es ginge um eine Liste mit Namen, in der ersten Combobox ließe sich wählen ob man einen männlichen oder einen weiblichen Namen wählen möchte.
    Die zweite Combobox würde, je nach der zuvor getroffenen Auswahl, eine Liste mit den entsprechenden Namen anzeigen.

    Naja, ich kenne mich nun leider nicht so gut mit VB aus, deshalb hoffe ich das mir hier jemand helfen kann.
    Besten Dank schonmal im voraus
    da musste in dem selectedIndexChanged Event der ersten cb eine Selectcase routine erstellen, dort den text der ersten cb überprüfen lassen und danach halt die items der 2. cb anpassen.

    Hier nochmal ein beispiel(grade zusammengeschustert):

    VB.NET-Quellcode

    1. Private Parent_Daten() As String = {"Haus", "Wohnung", "Container"}
    2. Dim child_case1() As String = {"Groß", "Schön", "Teuer", "6 Zimmer"}
    3. Dim child_case2() As String = {"Klein", "Billig", "3 Zimmer"}
    4. Dim child_case3() As String = {"o.O", "Niemals!", "Kostet nichts", "1 Zimmer", "unbewohnbar"}
    5. Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    6. ComboBox2.Items.Clear()
    7. Select Case ComboBox1.Text
    8. Case Parent_Daten(0)
    9. For Each info As String In child_case1
    10. 'haus
    11. ComboBox2.Items.Add(info)
    12. Next
    13. Case Parent_Daten(1)
    14. For Each info As String In child_case2
    15. 'wohnung
    16. ComboBox2.Items.Add(info)
    17. Next
    18. Case Parent_Daten(2)
    19. For Each info As String In child_case3
    20. 'container
    21. ComboBox2.Items.Add(info)
    22. Next
    23. End Select
    24. End Sub
    25. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    26. For Each info As String In Parent_Daten
    27. ComboBox1.Items.Add(info)
    28. Next
    29. ComboBox1.SelectedIndex = 0
    30. End Sub



    VB.NET-Quellcode

    1. Private Parent_Daten() As String = {"Haus", "Wohnung", "Container"}

    Hier deklariere ich die Daten(items) für die erste combobox.
    in dem Fall "haus" "Wohnung" und "Container".
    die haben in der Reihenfolge automatisch ein Index ab 0 increment 1.(3 Einträge = 0 bis 2)


    VB.NET-Quellcode

    1. Dim child_case1() As String = {"Groß", "Schön", "Teuer", "6 Zimmer"}
    2. Dim child_case2() As String = {"Klein", "Billig", "3 Zimmer"}
    3. Dim child_case3() As String = {"o.O", "Niemals!", "Kostet nichts", "1 Zimmer", "unbewohnbar"}



    Da ich 3 Einträge für die Parentbox habe, brauche ich auch 3 verschiedene Ansammlungen von Outputs.
    Diese sind auch wieder in Arrays gespeichert.


    Nun im SelectedindexChanged Event der CheckBox1 ( erreichst du durch einen Doppelklick auf das Control :(

    VB.NET-Quellcode

    1. ComboBox2.Items.Clear()

    Damit die Einträge neu geschrieben werden und nicht einfach nur angefügt werden.

    VB.NET-Quellcode

    1. Select Case ComboBox1.Text
    2. Case Parent_Daten(0)
    3. For Each info As String In child_case1
    4. 'haus
    5. ComboBox2.Items.Add(info)
    6. Next
    7. Case Parent_Daten(1)
    8. For Each info As String In child_case2
    9. 'wohnung
    10. ComboBox2.Items.Add(info)
    11. Next
    12. Case Parent_Daten(2)
    13. For Each info As String In child_case3
    14. 'container
    15. ComboBox2.Items.Add(info)
    16. Next
    17. End Select


    Hier frage ich den jeweiligen selektierten index der ersten Combobox ab und füge dann jeweils mit einer ForEach-Schleife
    den Inhalt der jeweilgen deklarierten Variable ein.

    Im Form load sollte natürlich der Inhalt der ComboBox1 geschrieben werden:

    VB.NET-Quellcode

    1. For Each info As String In Parent_Daten
    2. ComboBox1.Items.Add(info)
    3. Next


    MfG GTW

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „GimpTutWorks“ ()

    Hiemal, wie man die Sache per Databinding aufziehen könnte. Dabei ist kein dynamischer Code mehr nötig, sondern man richtet das ein, und funktioniert.

    VB.NET-Quellcode

    1. Public Class Form1
    2. ''' <summary>Datenmodell</summary>
    3. Public Class Domizil
    4. Public Property Name As String '1 Name
    5. Public Property Eigenschaften As String() 'viele Eigenschaften
    6. End Class
    7. Private _Domizilse As New List(Of Domizil)
    8. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    9. 'Datenmodell füllen
    10. Dim dmz = New Domizil With {.Name = "Haus", .Eigenschaften = {"Groß", "Schön", "Teuer", "6 Zimmer"}}
    11. _Domizilse.Add(dmz)
    12. dmz = New Domizil With {.Name = "Wohnung", .Eigenschaften = {"Klein", "Billig", "3 Zimmer"}}
    13. _Domizilse.Add(dmz)
    14. dmz = New Domizil With {.Name = "Container", .Eigenschaften = {"o.O", "Niemals!", "Kostet nichts", "1 Zimmer", "unbewohnbar"}}
    15. _Domizilse.Add(dmz)
    16. 'BindingSources anbinden
    17. Dim bsDmz As New BindingSource
    18. bsDmz.DataSource = _Domizilse
    19. Dim bsProps As New BindingSource
    20. bsProps.DataSource = bsDmz
    21. bsProps.DataMember = "Eigenschaften"
    22. 'Gui anbinden
    23. ComboBox1.DataSource = bsDmz
    24. ComboBox1.DisplayMember = "Name"
    25. ComboBox2.DataSource = bsProps
    26. End Sub
    27. End Class
    @EDR:
    Das ist natürlich die beste Lösung, aber:

    freefall schrieb:

    Naja, ich kenne mich nun leider nicht so gut mit VB aus


    Für nen Anfänger völlig ausreichend.
    Natürlich spricht auch nichts dagagen, sich als Anfänger direkt das Bein zu brechen ^^

    MfG GTW
    naja, vlt. schaffter die 30 zeilen auch ohne Beinbruch, dann hätter den grundlegende Blickwechsel geschafft, der üblicherweise erst nach Jahren erfolgt (wenn überhaupt), und dann vielfach teurer ist: Nämlich den Blick weg von den Controls, und wie man was da reintut oder raustut, und hin zu den Daten, und wie diese strukturiert sind.

    Meinen Ansatz könnte man fortsetzen, wollteman das Sample sinnvoll weiterführen, bei deinem Ansatz würde sich die Holzwegigkeit sehr schnell zeigen.
    ZB wennman die Eigenschaften der Domizile standardisier- und eingebbar machen möchte - sowas wie: "EigenschaftName = Wert".

    Also schon son Winzteil failt vom Ansatz her, wenn man auf die Controls stiert, statt ein Datenmodell zu konzipieren.