abhängige Comboboxen

  • Guten Morgen zusammen,

    ich glaube ich habe ein großes Problem.
    Ich habe eine sehr umfangreiche Combobox mit vielen Daten.

    Aus dieser 1. Combobox muß ich einen Haupt-Eintrag wählen
    und dann sollen die dazugehörigen Werte in der 2. Combobox ausgewählt werden.

    Beispiel mit Städten:
    Deutschland = Berlin, Köln, Düsseldorf....
    Frankreich = Paris, Lyon...


    Also die erste Box ist bereits voller Daten (sehr viele)
    Aber wie kann man die 2. Box die alle Daten enthält filtern.
    Beispiel 2. Box: Berlin, Köln, Düsseldorf, Paris, Lyon

    macht man das so?

    Ich habe mal ein Beispiel gemacht:

    [autoit]


    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    $Form1 = GUICreate("Form1", 419, 84, 192, 124)
    $Ausbilder = GUICtrlCreateCombo("Auswahl", 28, 32, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
    GUICtrlSetData(-1, "Deutschland|Frankreich|Italien")
    $Stadt = GUICtrlCreateCombo("Auswahl", 208, 32, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Label1 = GUICtrlCreateLabel("Land", 28, 12, 28, 17)
    $Label2 = GUICtrlCreateLabel("Stadt", 208, 8, 29, 17)
    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    [/autoit][autoit][/autoit][autoit]

    EndSwitch
    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit]

    Meine Frage:

    Zitat

    Wo bringe ich meine Daten unter? (Tabelle, Ini....?)
    Wie kann ich das ganze abhängig machen?
    Muß ich alles mit If oder case machen? (wäre ein großer Aufwand)

    Wäre toll wenn Ihr mir einige Tipps geben könnt,
    wie man dieses Problem lösen kann?

    Liebe Grüße
    Ilse ;)

    Einmal editiert, zuletzt von Ilse (18. Januar 2011 um 13:37)

  • Hallo Ilse,

    hier ein Beispiel zur Verwendung von 2 ComboBoxen, die beide ihre Daten aus einem Textfile beziehen:

    Spoiler anzeigen
    [autoit]

    #Include <GuiComboBox.au3>
    #include <GUIConstantsEx.au3>
    #include <array.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Const $sCSV = @ScriptDir & "\2cbo.TXT"
    Const $sElect = "bitte auswählen"
    Dim $a_sCSV, $aSplit, $scboChr = ""
    _FileReadToArray($sCSV,$a_sCSV)
    Dim $aCSV[$a_sCSV[0]][2]
    for $i = 1 to UBound($a_sCSV) - 1
    ConsoleWrite($i & $a_sCSV[$i] & @CRLF)
    $aSplit = StringSplit($a_sCSV[$i],";")
    if not StringInStr($scboChr,$aSplit[1]) Then $scboChr &= $aSplit[1] & "|"
    $aCSV[$i-1][0] = $aSplit[1]
    $aCSV[$i-1][1] = $aSplit[2]
    Next
    ConsoleWrite($scboChr & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate("2 Comboboxen aus 1er CSV", 250, 120, 302, 218)
    $hcboChr = GUICtrlCreateCombo($sElect, 8, 8, 200, 25)
    GUICtrlSetData(-1,$scboChr)
    $hcboChrNr = GUICtrlCreateCombo("",8,35,200,25)
    $hbtnExit = GUICtrlCreateButton("Be&enden", 8, 65)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $hbtnExit
    Exit
    Case $hcboChr
    $sVal = GUICtrlRead($hcboChr)
    GUICtrlSetData($hcboChrNr,"")
    if $sVal <> $sElect Then
    $aSplit = _ArrayFindAll($aCSV,$sVal,0,0,True,True,0)
    $scboChr = ""
    for $i = 0 to UBound($aSplit) - 1
    $scboChr &= $aCSV[$aSplit[$i]][1] & "|"
    Next
    ConsoleWrite($scboChr & @CRLF)
    GUICtrlSetData($hcboChrNr,$scboChr)
    _GUICtrlComboBox_SetCurSel($hcboChrNr, 0)
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Hier das dazugehörige Textfile: Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    mfg autoBert

  • Hallo Autobert,

    merci für deine Hilfe.
    Dein Beispiel klappt prima!

    Aber mal eine Frage:

    Ich dachte da irgendwie an einen Zahlenindex!
    Also eine riesige Tabelle wo man so etwas übersichtlich eintragen kann.

    Combobox 1

    Zitat

    Index;Land;Stadt
    1= Deutschland
    2= Frankreich

    das erfassen und die Zuordnung
    macht mir noch etwas zu schaffen.

    Kannst du mir da noch einen Tipp geben?
    Damit das ganze nicht im Chaos endet.


    Liebe Grüße
    Ilse ;)

    • Offizieller Beitrag

    Das könnte dann ungefähr so aussehen:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $aLand[3] = ["Deutschland", "Frankreich", "Italien"], $sLand = _ArrayToString($aLand)
    Global $aStadt[3] = ["Berlin|Köln|Düsseldorf", "Paris|Lyon|Le Mans", "Rom|Neapel|Modena"]

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Form1", 419, 84, 192, 124)
    $Ausbilder = GUICtrlCreateCombo("Auswahl", 28, 32, 145, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL))
    GUICtrlSetData(-1, $sLand)
    $Stadt = GUICtrlCreateCombo("Auswahl", 208, 32, 145, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL))
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Label1 = GUICtrlCreateLabel("Land", 28, 12, 28, 17)
    $Label2 = GUICtrlCreateLabel("Stadt", 208, 8, 29, 17)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Ausbilder
    For $i = 0 To UBound($aLand) - 1
    If GUICtrlRead($Ausbilder) = $aLand[$i] Then
    GUICtrlSetData($Stadt, "")
    GUICtrlSetData($Stadt, "Auswahl")
    GUICtrlSetData($Stadt, $aStadt[$i], "Auswahl")
    ExitLoop
    EndIf
    Next
    If $i < UBound($aLand) Then
    GUICtrlSetState($Stadt, $GUI_ENABLE)
    Else
    GUICtrlSetState($Stadt, $GUI_DISABLE)
    EndIf
    Case $Stadt
    MsgBox(0, "Stadt", GUICtrlRead($Stadt))
    EndSwitch
    WEnd

    [/autoit]