Comboboxen verknüpfen

  • Hallo

    Ich habe ein Problem damit zwei Comboboxen miteinander zu "verknüpfen" bzw. ihre Inhalte dynamisch auf einander abzustimmen.

    Ich hab ein mir via Koda eine GUI erstellt in der mehrere Comboboxen auftauchen.
    Der Inhalt der erste Combobox wird aus einer Ordnerstruktur ausgelesen. Das heißt er scannt ein Verzeichnis und gibt die Namen aller Unterordner als Auswahl in die Combox "Geraetetyp". Soweit so gut.

    Jetzt habe ich eine zweite Combobox "Templates". Diese soll ihren Inhalt je nach Auswahl in der Combobox "Geraetetyp" anpassen und ihren Inhalt ebenfalls auslesen allerdings eine Verzeichnisstiefe tiefer und basierend auf der Vorauswahl aus Geraetetyp.

    Zur Veranschaulichung versuch ich mal die Ordnerstruktur abbzubilden.

    Im Allgemeinen lautet der Pfad so: \\Templates\OriginalTemplates\"Geratetyp"\"Template"

    Im Speziellen stellt sich das so dar:
    \C2960\Template1
    \Template2
    \C3560\Template1
    \Template2
    . .
    . .
    . .
    . .

    Der User soll also per Combobox "Geraetetyp" ein Gerät auswählen für welches er dann in der Combobox "Templates" die dafür vorhandenen Templates sieht und davon eines auswählen kann.

    Das Auslesen funktioniert super, nur leider die Verknüpfung nicht.

    [autoit]


    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <File.au3>
    #Include <Array.au3>
    #include <Date.au3>

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

    $Form1 = GUICreate("Switche", 902, 665, 261, 137)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    $Geraetetyp = GUICtrlCreateCombo("Geraetetyp", 384, 48, 145, 25)
    $Template = GUICtrlCreateCombo("Template", 384, 264, 257, 25)

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

    GUISetState(@SW_SHOW)
    Opt("GUIOnEventMode", 1)

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

    Global $Path, $Filter

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

    $Path="J:\Templates\OriginalTemplates\"
    $Filter='*.*'
    ;Ab hier wird die Combobox "Geraetetyp befüllt
    $FileList=_FileListToArray($Path,$Filter,2)
    If @Error=1 Then
    MsgBox (0,"","No Files\Folders Found.")
    Exit
    EndIf
    Global $Dateiname[UBound($FileList)]

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

    For $i=0 To UBound($FileList)-1
    GUICtrlSetData($Geraetetyp, $FileList[$i])
    Next
    ;Ende befüllen

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

    Switch GUICtrlRead($Geraetetyp)

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

    Case GUICtrlRead($Geraetetyp) <> "Geraetetyp"
    $Path2=GUICtrlRead($Geraetetyp)
    $Path3=$Path&$Path2&"\"
    $Filter='*.au3'
    $Templatelist=_FileListToArray($Path3,$Filter,1)
    If @Error=1 Then
    MsgBox (0,"","No Files\Folders Found.")
    Exit
    EndIf
    For $i=0 To UBound($Templatelist)-1
    GUICtrlSetData($Template, $Templatelist[$i])
    Next
    EndSwitch

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

    While 1
    Sleep(1000) ; Idle around
    WEnd

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

    Func CLOSEClicked()
    Exit
    EndFunc
    Next

    [/autoit]

    Einmal editiert, zuletzt von Cerverus (14. Oktober 2010 um 13:49) aus folgendem Grund: Hilfestellung erfolgreich

  • Setz ein Event auf die Gerätetyp-Combobox. Das füllen übernimmt dann die aufgerufene Funktion. Das Ganze könnte dann so aussehen - ungetestet.

    Spoiler anzeigen
    [autoit]

    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <Date.au3>

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

    $Form1 = GUICreate("Switche", 902, 665, 261, 137)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    $Geraetetyp = GUICtrlCreateCombo("Geraetetyp", 384, 48, 145, 25)
    GUICtrlSetOnEvent(-1, "_listTemplates")
    $Template = GUICtrlCreateCombo("Template", 384, 264, 257, 25)

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

    GUISetState(@SW_SHOW)
    Opt("GUIOnEventMode", 1)

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

    Global $Path, $Filter

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

    $Path = "J:\Templates\OriginalTemplates\"
    $Filter = '*.*'
    ;Ab hier wird die Combobox "Geraetetyp befüllt
    $FileList = _FileListToArray($Path, $Filter, 2)
    If @error = 4 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf

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

    For $i = 1 To $FileList[0]
    GUICtrlSetData($Geraetetyp, $FileList[$i])
    Next
    ;Ende befüllen

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

    Func _listTemplates()
    If GUICtrlRead($Geraetetyp) <> "Geraetetyp" Then
    $Templatelist = _FileListToArray($Path & GUICtrlRead($Geraetetyp), "*.au3", 1)
    If @error = 4 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf
    For $i = 1 To $Templatelist[0]
    GUICtrlSetData($Template, $Templatelist[$i])
    Next
    EndIf
    EndFunc ;==>_listTemplates

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

    While 1
    Sleep(1000) ; Idle around
    WEnd

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

    Func CLOSEClicked()
    Exit
    EndFunc ;==>CLOSEClicked

    [/autoit]

    _FileListToArray() legt im ersten Element den Index des letzten Arrayelements ab. Die FOR-Schleifen müssten also bei $i=1 starten.

  • Danke für diese ultraschnelle Antwort. Funktioniert wunderbar, bis auf den Schönheitsfehler, dass sich die "Template" Combobox den Inhalt vorheriger Werte merkt. Kann man die irgendwie löschen ?

    Edit: Hab den Befehl zum Reseten gefunden.

    [autoit]

    _GUICtrlComboBox_ResetContent

    [/autoit]

    Nochmals vielen Dank für die Hilfe. Die Idee mit der Funktion und dem Event ist super.

  • Auch wenn du es jetzt schon selbst geunden hast....

    [autoit]

    Func _listTemplates()
    If GUICtrlRead($Geraetetyp) <> "Geraetetyp" Then
    $Templatelist = _FileListToArray($Path & GUICtrlRead($Geraetetyp), "*.au3", 1)
    If @error = 4 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf
    _GUICtrlComboBoxEx_ResetContent(GUICtrlGetHandle($Template))
    For $i = 1 To $Templatelist[0]
    GUICtrlSetData($Template, $Templatelist[$i], $Templatelist[1])
    Next
    EndIf
    EndFunc ;==>_listTemplates

    [/autoit]

    In GUICtrlSetData() würde ich jetzt einen Default Wert setzen weil dein ursprünglicher Eintrag ja entfernt wird. ;)