Listview mit Gruppen: Einfache Möglichkeit alle Items einer Gruppe auszulesen?

  • Hey,


    ich suche eine Möglichkeit herauszufinden wieviele Items in einer Gruppe sind.
    z.B. lese ich eine INI ein und stelle diese mit Hilfe von Gruppen in einem Listview dar:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <File.au3>

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

    Global $ini = "" ;Pfad zur ini

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

    $Form1 = GUICreate("Ini read to Listview - Beispiel", 700, 500, -1, -1)
    $ListView1 = GUICtrlCreateListView("", 20, 20, 660, 350)
    $hlistview = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_AddColumn($hlistview, "Key", 200)
    _GUICtrlListView_AddColumn($hlistview, "Value", 450)

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

    $Button2 = GUICtrlCreateButton("Iniread", 20, 420, 120, 33, 0)
    $Button1 = GUICtrlCreateButton("Add", 220, 420, 120, 33, 0)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button2
    _Initolistview($hlistview, $ini)
    Case $Button1
    _Add()
    EndSwitch
    WEnd

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

    Func _Initolistview($hwnd, $path)
    ; nuts (http://www.autoit.de)
    ; $hwnd = Handle to the listview
    ; $path = ini path
    Local $anames, $aread
    If Not IsHWnd($hwnd) Then
    SetError(1,0,1) ;not a handle -> @error = 1
    Return
    ElseIf Not FileExists($path) Then
    SetError(1,0,2) ;ini not found -> @error = 2
    Return
    EndIf
    $anames = IniReadSectionNames($path)
    $counter = -1;_GUICtrlListView_GetItemCount($hwnd)
    For $i = 1 To $anames[0]
    $aread = IniReadSection($path, $anames[$i])
    If @error Then
    $counter += 1
    _GUICtrlListView_EnableGroupView($hwnd)
    _GUICtrlListView_InsertGroup($hwnd, -1, $i, $anames[$i])
    _GUICtrlListView_AddItem($hwnd, "Kein Eintrag")
    _GUICtrlListView_SetItemGroupID($hwnd, $counter, $i)
    ContinueLoop
    EndIf
    _GUICtrlListView_EnableGroupView($hwnd)
    _GUICtrlListView_InsertGroup($hwnd, -1, $i, $anames[$i])
    For $x = 1 To $aread[0][0]
    $counter += 1
    _GUICtrlListView_AddItem($hwnd, $aread[$x][0])
    _GUICtrlListView_AddSubItem($hwnd, $counter, $aread[$x][1], 1)
    _GUICtrlListView_SetItemGroupID($hwnd, $counter, $i)
    Next

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

    Next
    EndFunc ;==>_Initolistview

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

    Func _Add()
    #region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form1", 431, 200, 192, 124)
    $Input1 = GUICtrlCreateInput("", 40, 64, 113, 21)
    $Input2 = GUICtrlCreateInput("", 192, 64, 177, 21)
    $Label1 = GUICtrlCreateLabel("Key", 40, 32, 36, 17)
    $Label2 = GUICtrlCreateLabel("Value", 192, 32, 36, 17)
    $Button = GUICtrlCreateButton("Übernehmen", 140, 150, 120, 33, 0)
    GUISetState(@SW_HIDE, $Form1)
    GUISetState(@SW_SHOW, $Form2)
    #endregion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete($Form2)
    GUISetState(@SW_SHOW, $Form1)
    ExitLoop
    case $Button
    local $count
    _GUICtrlListView_AddItem($hlistview,GUICtrlRead($Input1))
    local $count=_GUICtrlListView_GetItemCount($hlistview)-1
    _GUICtrlListView_AddSubItem($hlistview,$count,GUICtrlRead($Input1),1)
    _GUICtrlListView_SetItemGroupID($hlistview,$count,1)
    GUIDelete($Form2)
    GUISetState(@SW_SHOW, $Form1)
    ExitLoop
    EndSwitch
    WEnd
    EndFunc ;==>_Add

    [/autoit]

    Um die INI wieder zurückzuschreiben müsste man jetzt wissen wieviele Gruppen es gibt (_GUICtrlListView_GetGroupCount) und eben wieviele Items in einer Gruppe drin sind (oder den Index des Start- bzw. des Enditems).
    Gibt es dafür eine einfache Möglichkeit? In der HIlfe hab ich keinen passenden Befehl gefunden.

    Gruß nuts

  • Mal ein Versuch von mir:

    Spoiler anzeigen
    [autoit]


    Func _GetListview_GroupItems($hwnd, $iGruop, $index = 0)
    Local $count = $index
    Local $istart = $index
    Local $aret[2]
    Local $imode
    If _GUICtrlListView_GetItemGroupID($hwnd, $index) > $iGruop Then
    $imode = 2
    ElseIf _GUICtrlListView_GetItemGroupID($hwnd, $index) = $iGruop Then
    $imode = 1
    ElseIf _GUICtrlListView_GetItemGroupID($hwnd, $index) < $iGruop Then
    $imode = 0
    Else
    $imode = 0
    $index = 0
    EndIf

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

    Local $imax = _GUICtrlListView_GetItemCount($hwnd) -1
    Local $istart = 0
    Local $iend = $imax
    Switch $imode
    Case 0
    For $i = $index To $imax
    If _GUICtrlListView_GetItemGroupID($hwnd, $i) = $iGruop Then
    $istart = $i
    ExitLoop
    EndIf
    Next
    For $i = $istart To $imax
    If _GUICtrlListView_GetItemGroupID($hwnd, $i) > $iGruop Then
    $iend = $i - 1
    ExitLoop
    EndIf
    Next
    Case 2
    For $i = $index To 0 Step -1
    If _GUICtrlListView_GetItemGroupID($hwnd, $i) = $iGruop Then
    $iend = $i
    ExitLoop
    EndIf
    Next
    For $i = $iend To 0 Step -1
    If _GUICtrlListView_GetItemGroupID($hwnd, $i) < $iGruop Then
    $istart = $i + 1
    ExitLoop
    EndIf
    Next
    Case 1
    For $i = $index To 0 Step -1
    If _GUICtrlListView_GetItemGroupID($hwnd, $i) < $iGruop Then
    $istart = $i + 1
    ExitLoop
    EndIf
    Next
    For $i = $index To $imax
    If _GUICtrlListView_GetItemGroupID($hwnd, $i) > $iGruop Then
    $iend = $i - 1
    ExitLoop
    EndIf
    Next
    EndSwitch

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

    $aret[0] = $istart
    $aret[1] = $iend
    ;_ArrayDisplay($aret)
    Return $aret

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

    EndFunc ;==>_GetListview_GroupItems

    [/autoit]


    So richtig gefällt mir das aber noch nicht. :wacko: