Listview (Tabelle) vs. Formular (Labels + Inputs) in 2 TabControlls

  • Guten Morgen,

    einen Teil der Anfrage hatte ich schon in einem anderen Thread, jedoch gehört die Anfrage auf Grund der Überschrift da eigentlich nicht wirklich hin, weshalb ich mal eine neue Anfrage zu diesem Thema starte.

    Kurze Vorgeschichte. Habe mir ein GUI gebaut, mit der ich diverse Datenbanken abfragen kann. Da das Ergebnis jedoch oft so viele Spalten hat, bzw. die Spaltenbreite groß sein kann, kommt schnell die horizontale Scrollbar zu Gesicht. Aus diesem Grund wollte ich folgende Lösung bauen. Ein TabControl mit 2 Tabs. Tab1 (linker Tab) soll "Tabelle" heißen, Tab2 (rechter Tab) soll "Details" heißen.

    [autoit]

    $MainGUITab = GUICtrlCreateTab(10, 90, $GUIWidth - 20, 670)
    $MainGUITabTabelle = GUICtrlCreateTabItem("Tabelle")
    $MainGUITabDetails = GUICtrlCreateTabItem("Details")
    GUICtrlCreateTabItem(""); Beendet die Tab Definition
    GUICtrlSetState($MainGUITabTabelle, $GUI_SHOW) ; Tabelle erscheint zuerst

    [/autoit]

    Unter "Tabelle" lasse ich nur noch die ganz wichtigen Dinge optisch erscheinen, sodass alles auf eine Seite passt (ohne Scrollbar)

    Jetzt wird ein TabControl (sorry bin damit noch neu unterwegs) soweit ich weiß so aufgebaut.

    1. GUI
    2. erster Tab
    3. Inhalt unterhalb erster Tab
    4. zweiter Tab
    5. Inhalt unterhalb zweiter Tab
    6. Endtab

    Mein Problem ist jedoch, das ich erst die TabControls ohne Inhalt erzeuge. Dann kommt meine SQL Abfrage. Das Ergebnis wird dann als Listview erzeugt. Da ich

    [autoit]

    $MainGUITabTabelle

    [/autoit]

    zuerst erscheinen lasse, sieht das augenscheinlich auch so aus, als ob die Listview unter "Tabelle" erscheint. Wenn ich jedoch auf den Tab "Details" gehe, sehe ich die Listview auch, was ich nicht möchte.

    Außerdem zerstöre ich die Listview immer vor dem Neuaufbau. Grund dafür steht ab hier

    [autoit]

    _GUICtrlListView_Destroy($listview)
    $listview = GUICtrlCreateListView("", 10, 110, $GUIWidth - 23, 648);,$LVS_SORTDESCENDING)

    [/autoit]

    Ziel sollte sein, das die Listview nur im linken Tab erscheint. Kann ich das nicht irgendwie über

    [autoit]

    $MainGUITabTabelle

    [/autoit]

    zuordnen lassen ? Wenn ich dann eine Zeile markiere, würde ich eine 2 SQL Abfrage abfeuern, welche auf Grund der markierten ID mir ein detailiertes Ergebnis im rechten Tab unter "Details" liefern soll. Hier würde ich das dann mit Labels und InputControls verwirklichen.

    Könnt Ihr mir hier ein wenig auf die Sprünge helfen, wie ich die Zuteilung zum jeweiligen Tab hinbekomme.

    Danke

  • Mit GUISwitch vorher zum Tab wechseln und dann das Listview erstellen.

    Aber ich würde das Listview von vornherein erstellen und dann nach der Abfrage es befüllen. So mach ich das.

  • Hi m-obi,

    da habe ich wohl den 2. Parameter elegant ausgeblendet :)

    Habe jetzt mal folgendermaßen umgebaut:

    [autoit]


    $MainGUI = GUICreate("Meine GUI" & $Version, $GUIWidth, $GUIHeight, Default, Default); Starte HauptGUI
    ;...
    $MainGUITab = GUICtrlCreateTab(10, 90, $GUIWidth - 20, 670)
    $MainGUITabTabelle = GUICtrlCreateTabItem("Tabelle")
    ;~ $listview = GUICtrlCreateListView("", 10, 110, $GUIWidth - 23, 648);,$LVS_SORTDESCENDING)
    $listview = _GUICtrlListView_Create($MainGUI, "", 10, 110, $GUIWidth - 23, 648)
    $MainGUITabDetails = GUICtrlCreateTabItem("Details")
    GUICtrlCreateTabItem(""); Beendet die Tab Definition
    GUICtrlSetState($MainGUITabTabelle, $GUI_SHOW) ; Tabelle erscheint zuerst

    [/autoit]


    und in Function sieht es dann so aus:

    [autoit]


    GUISwitch($MainGUI,$MainGUITabTabelle)
    For $i = 1 To $Spaltenanzahl
    ConsoleWrite ("Variable i = " & $i & @CRLF)
    Local $SpalteX = "$Spalte" & $i
    ConsoleWrite ("$SpalteX = " & $SpalteX & @CRLF)
    _GUICtrlListView_InsertColumn($listview, $i, $SpalteX, 50)
    Next

    [/autoit]


    Leider scheint das keinerlei Auswirkung zu haben. Ich sehe die Listview sowohl im Tab "Tabelle" als auch im Tab "Details".
    Irgendwie hänge ich jetzt voll ?(

  • Ich hatte ein ähnliches problem, habe eine Livesearch für Listviews erstellt.
    Nachdem BugFix mir einen Gedankenstoß verpasst hatte war das eigentlich relativ simpel.

    Du erstellst eine GUI mit zwei tabs, machst in den Tab 1 eine Listview mit so vielen Spalten wie sie deine DB hat. Dann arbeitest du mit _GUICtrlListView_HideColumn und fertig ist ^^

    Kann dir (leider erst nächste Woche wenn) mein Beispiel mal zeigen.

    So Far

    Grüße Yaerox

    Grüne Hölle

  • Hi YaeroxXO,

    OK, das Prinzip könnte ich verstehen, aber ich denke nicht, das es mein Problem löst. Ich bekomme die Listview immer auf beiden Tabs dargestellt, ich will Sie aber nur unter dem 1. Tab sehen. Wenn ich den 2. Tab anklicke, erwarte ich (so denke ich zumindest) ein leere Controllfenster. Ich bin ich hier auf dem Holzweg ?

    So, dann mal schöne Pfingsten, wir hören am Dienstag wieder voneinader

    • Offizieller Beitrag

    Das UDF Listview wird nicht auf dem Tab, sondern auf der Hauptgui erstellt, genau wie du es beim erstellen vorgegeben hast.
    Benutze ein Standard-Listview, dann wird es auch auf deim Tab angezeigt.

  • Ich würde es auch mit dem normalen Control machen.

    Ansonsten kannst es so machen. Halt ein Workaround.

    Spoiler anzeigen
    [autoit]

    #Include <GuiListView.au3>
    #Include <GUIConstantsEx.au3>

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

    $MainGUI = GUICreate("Meine GUI", 600, 700, Default, Default); Starte HauptGUI
    $listview = _GUICtrlListView_Create($MainGUI, "Spalte1|Spalte2", 10, 110, 600 - 23, 548)
    $MainGUITab = GUICtrlCreateTab(10, 90, 600 - 20, 570)
    $MainGUITabTabelle = GUICtrlCreateTabItem("Tabelle")
    $MainGUITabDetails = GUICtrlCreateTabItem("Details")
    GUICtrlCreateTabItem(""); Beendet die Tab Definition
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $MainGUITab
    If GUICtrlRead($MainGUITab) = 0 Then
    WinSetState($listview, "", @SW_SHOW)
    Else
    WinSetState($listview, "", @SW_HIDE)
    EndIf
    EndSwitch
    WEnd

    [/autoit]