Treeview Hilfe

  • Hi,

    da ich mich noch nie mit Treeview beschäftigt habe, weiß ich momentan nicht, wie ich am besten die Daten in einem Treeview darstellen kann!

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiTreeView.au3>
    #include <ListViewConstants.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>

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

    $data = "SIC2|E:\AU3\SIC2|0|True||OK|Everyone|Full Access" & @LF & _
    "AU3$|E:\AU3|0|10|Coding Share|OK|Everyone|Full Access" & @LF & _
    "Output|E:\AU3\SIC2\Output|0|True||OK|Everyone|Full Access" & @LF & _
    "SDOC|E:\SDOC|0|True|Test Share|OK|Administrators|Full Access" & @LF & _
    "SDOC|E:\SDOC|0|True|Test Share|OK|Everyone|Change Access" & @LF & _
    "HPBin|E:\Hewlett-Packard\ESS Sizers\Profile Manager\Bin|0|True||OK|Everyone|Read Access" & @LF & _
    "wmpub|C:\wmpub|0|True||OK|Administrators|Full Access" & @LF & _
    "wmpub|C:\wmpub|0|True||OK|Everyone|Read Access" & @LF & _
    "wmpub|C:\wmpub|0|True||OK|Users|Change Access" & @LF & _
    "wmiislog|C:\wmpub\wmiislog|0|True||OK|Everyone|Full Access" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Guest|Full Access Denied" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Administrators|Full Access" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Everyone|Read Access" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Power Users|Change Access"

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

    $aData = Create2DArray($data)

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

    $hGUI = GUICreate("Test", 800, 600)
    $hTreeview = GUICtrlCreateTreeView(8, 144, 257, 362, BitOR($GUI_SS_DEFAULT_TREEVIEW,$TVS_EDITLABELS,$TVS_CHECKBOXES,$TVS_SINGLEEXPAND,$WS_BORDER))
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    $hListview = GUICtrlCreateListView("Share|Path|Type|Max. Allowed|Description|Status|Account|Permission", 272, 144, 522, 362, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_AUTOARRANGE), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES))
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    GUISetState(@SW_SHOW)

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

    $hImage = _GUIImageList_Create(16, 16, 5, 3)
    _GUIImageList_AddIcon($hImage, "shell32.dll", 85)
    _GUICtrlTreeView_SetNormalImageList($hTreeview, $hImage)

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

    _GUICtrlTreeView_BeginUpdate($hTreeview)
    $root = _GUICtrlTreeView_Add($hTreeview, 1, "Shares on TEST_System", 0, 0)
    _GUICtrlTreeView_AddChild($hTreeview, $root, "C:\Program Files\AutoIt3", 0, 0)
    $hTVItem = _GUICtrlTreeView_AddChild($hTreeview, $root, "C:\wmpub", 0, 0)
    $hTVItem = _GUICtrlTreeView_AddChild($hTreeview, $hTVItem, "wmiislog", 0, 0)
    $hTVItem = _GUICtrlTreeView_AddChild($hTreeview, $root, "E:\AU3", 0, 0)
    $hTVItem2 = _GUICtrlTreeView_AddChild($hTreeview, $hTVItem, "SIC2", 0, 0)
    $hTVItem2 = _GUICtrlTreeView_AddChild($hTreeview, $hTVItem2, "Output", 0, 0)
    $hTVItem = _GUICtrlTreeView_AddChild($hTreeview, $root, "E:\Hewlett-Packard\ESS Sizers\Profile Manager\Bin", 0, 0)
    $hTVItem = _GUICtrlTreeView_AddChild($hTreeview, $root, "E:\SDOC", 0, 0)
    _GUICtrlTreeView_EndUpdate($hTreeview)
    _GUICtrlTreeView_Expand($hTreeview)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete($hGUI)
    Exit
    EndSwitch
    WEnd

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

    Func Create2DArray($string, $delimiter = "|")
    If $string = "" Then Return SetError(1, 0, 0)
    Local $aTemp = StringRegExp($string, "(.*\" & $delimiter & ".*)", 3), $aTmp, $i, $j
    Local $2DArray[UBound($aTemp)][8]
    For $i = 0 To UBound($aTemp) - 1
    $aTmp = StringSplit($aTemp[$i], $delimiter)
    For $j = 1 to $aTmp[0]
    $2DArray[$i][$j - 1] = $aTmp[$j]
    Next
    Next
    _ArraySort($2DArray, 0, 0, 0, 1)
    Return SetError(0, 0, $2DArray)
    EndFunc

    [/autoit]

    Das Skript erzeugt die Ansicht, wie ich es haben will (manuell erstellt). Wie kann ich den Baum allgemein nach dem Beispiel erstellen? Der Knoten nur auf Level1 (unter Shares on TEST_System) soll editierbar sein!

    Vielen DANK schon mal im voraus!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    • Offizieller Beitrag

    So müsste es passen:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiTreeView.au3>
    #include <ListViewConstants.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>

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

    $data = "SIC2|E:\AU3\SIC2|0|True||OK|Everyone|Full Access" & @LF & _
    "AU3$|E:\AU3|0|10|Coding Share|OK|Everyone|Full Access" & @LF & _
    "Output|E:\AU3\SIC2\Output|0|True||OK|Everyone|Full Access" & @LF & _
    "SDOC|E:\SDOC|0|True|Test Share|OK|Administrators|Full Access" & @LF & _
    "SDOC|E:\SDOC|0|True|Test Share|OK|Everyone|Change Access" & @LF & _
    "HPBin|E:\Hewlett-Packard\ESS Sizers\Profile Manager\Bin|0|True||OK|Everyone|Read Access" & @LF & _
    "wmpub|C:\wmpub|0|True||OK|Administrators|Full Access" & @LF & _
    "wmpub|C:\wmpub|0|True||OK|Everyone|Read Access" & @LF & _
    "wmpub|C:\wmpub|0|True||OK|Users|Change Access" & @LF & _
    "wmiislog|C:\wmpub\wmiislog|0|True||OK|Everyone|Full Access" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Guest|Full Access Denied" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Administrators|Full Access" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Everyone|Read Access" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Power Users|Change Access"

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

    $aData = Create2DArray($data)

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

    $hGUI = GUICreate("Test", 800, 600)
    $hTreeview = GUICtrlCreateTreeView(8, 144, 257, 362, BitOR($GUI_SS_DEFAULT_TREEVIEW,$TVS_EDITLABELS,$TVS_CHECKBOXES,$TVS_SINGLEEXPAND,$WS_BORDER))
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    $hListview = GUICtrlCreateListView("Share|Path|Type|Max. Allowed|Description|Status|Account|Permission", 272, 144, 522, 362, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_AUTOARRANGE), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES))
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    GUISetState(@SW_SHOW)
    _GUICtrlListView_AddArray($hListview, $aData)
    $hImage = _GUIImageList_Create(16, 16, 5, 3)
    _GUIImageList_AddIcon($hImage, "shell32.dll", 85)
    _GUICtrlTreeView_SetNormalImageList($hTreeview, $hImage)

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

    _GUICtrlTreeView_BeginUpdate($hTreeview)
    $root = _GUICtrlTreeView_Add($hTreeview, 1, "Shares on TEST_System", 0, 0)
    For $i = 0 To UBound($aData) - 1
    $hItem = _GUICtrlTreeView_FindParent($hTreeview, $aData[$i][1], $root)
    If $hItem Then
    _GUICtrlTreeView_AddChild($hTreeview, $hItem, $aData[$i][1])
    Else
    _GUICtrlTreeView_AddChild($hTreeview, $root, $aData[$i][1])
    EndIf
    Next
    _GUICtrlTreeView_EndUpdate($hTreeview)
    _GUICtrlTreeView_Expand($hTreeview)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete($hGUI)
    Exit
    EndSwitch
    WEnd

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

    Func _GUICtrlTreeView_FindParent($hTreeview, $sSearch, $hRoot)
    Local $sText, $hItem, $hNextSibling = _GUICtrlTreeView_GetFirstChild($hTreeview, $hRoot)
    If $hNextSibling = 0 Then Return $hItem
    Do
    $sText = _GUICtrlTreeView_GetText($hTreeview, $hNextSibling)
    If StringInStr($sSearch, $sText) Then
    If _GUICtrlTreeView_GetChildCount($hTreeview, $hNextSibling) > 0 Then $hItem = _GUICtrlTreeView_FindParent($hTreeview, $sSearch, $hNextSibling)
    If $hItem > 0 Then Return $hItem
    $hItem = $hNextSibling
    EndIf
    If $sSearch = $sText Then $hItem = -1
    $hNextSibling = _GUICtrlTreeView_GetNextSibling($hTreeview, $hNextSibling)
    Until $hNextSibling = 0
    Return $hItem
    EndFunc

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

    Func Create2DArray($string, $delimiter = "|")
    If $string = "" Then Return SetError(1, 0, 0)
    Local $aTemp = StringRegExp($string, "(.*\" & $delimiter & ".*)", 3), $aTmp, $i, $j
    Local $2DArray[UBound($aTemp)][8]
    For $i = 0 To UBound($aTemp) - 1
    $aTmp = StringSplit($aTemp[$i], $delimiter)
    For $j = 1 to $aTmp[0]
    $2DArray[$i][$j - 1] = $aTmp[$j]
    Next
    Next
    _ArraySort($2DArray, 0, 0, 0, 1)
    Return SetError(0, 0, $2DArray)
    EndFunc

    [/autoit]
  • VIELEN DANK OSCAR! :thumbup:

    Jetzt muss ich nur noch den Code verstehen und einige kleine Änderungen vornehmen, z.B. soll nicht das gesamte Array rechts im ListView dargestellt werden, sondern nur den Inhalt des jeweiligen Knotens.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    • Offizieller Beitrag

    Ich habe die Funktion mal mit ein paar Kommentaren versehen.
    Und eine Möglichkeit zum auswählen per Mausklick eingebaut (ich hoffe, dass Du das so meinst):

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiTreeView.au3>
    #include <ListViewConstants.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>

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

    $data = "SIC2|E:\AU3\SIC2|0|True||OK|Everyone|Full Access" & @LF & _
    "AU3$|E:\AU3|0|10|Coding Share|OK|Everyone|Full Access" & @LF & _
    "Output|E:\AU3\SIC2\Output|0|True||OK|Everyone|Full Access" & @LF & _
    "SDOC|E:\SDOC|0|True|Test Share|OK|Administrators|Full Access" & @LF & _
    "SDOC|E:\SDOC|0|True|Test Share|OK|Everyone|Change Access" & @LF & _
    "HPBin|E:\Hewlett-Packard\ESS Sizers\Profile Manager\Bin|0|True||OK|Everyone|Read Access" & @LF & _
    "wmpub|C:\wmpub|0|True||OK|Administrators|Full Access" & @LF & _
    "wmpub|C:\wmpub|0|True||OK|Everyone|Read Access" & @LF & _
    "wmpub|C:\wmpub|0|True||OK|Users|Change Access" & @LF & _
    "wmiislog|C:\wmpub\wmiislog|0|True||OK|Everyone|Full Access" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Guest|Full Access Denied" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Administrators|Full Access" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Everyone|Read Access" & @LF & _
    "AutoIt3$|C:\Program Files\AutoIt3|0|True||OK|Power Users|Change Access"

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

    $aData = Create2DArray($data)

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

    $hGUI = GUICreate("Test", 800, 600)
    $hTreeview = GUICtrlCreateTreeView(8, 144, 257, 362, BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_EDITLABELS, $TVS_CHECKBOXES, $WS_BORDER))
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    $hWndTreeview = GUICtrlGetHandle($hTreeview)
    $hDummyTreeview = GUICtrlCreateDummy()
    $hListview = GUICtrlCreateListView("Share|Path|Type|Max. Allowed|Description|Status|Account|Permission", 272, 144, 522, 362, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_AUTOARRANGE), BitOR($WS_EX_CLIENTEDGE, $LVS_EX_GRIDLINES))
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    GUISetState(@SW_SHOW)
    $hImage = _GUIImageList_Create(16, 16, 5, 3)
    _GUIImageList_AddIcon($hImage, "shell32.dll", 85)
    _GUICtrlTreeView_SetNormalImageList($hTreeview, $hImage)

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

    _GUICtrlTreeView_BeginUpdate($hTreeview)
    $root = _GUICtrlTreeView_Add($hTreeview, 1, "Shares on TEST_System", 0, 0)
    For $i = 0 To UBound($aData) - 1
    $hItem = _GUICtrlTreeView_FindParent($hTreeview, $aData[$i][1], $root)
    If $hItem Then
    _GUICtrlTreeView_AddChild($hTreeview, $hItem, $aData[$i][1])
    Else
    _GUICtrlTreeView_AddChild($hTreeview, $root, $aData[$i][1])
    EndIf
    Next
    _GUICtrlTreeView_EndUpdate($hTreeview)
    _GUICtrlTreeView_Expand($hTreeview)
    GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete($hGUI)
    Exit
    Case $hDummyTreeview
    $hSelItem = _GUICtrlTreeView_GetSelection($hWndTreeview)
    $sSelText = _GUICtrlTreeView_GetText($hTreeview, $hSelItem)
    If $sSelText = _GUICtrlTreeView_GetText($hTreeview, $root) Then
    _GUICtrlListView_AddArray($hListview, $aData)
    Else
    _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($hListview))
    For $i = 0 To UBound($aData) - 1
    If $aData[$i][1] = $sSelText Then
    $sTmp = ''
    For $j = 0 To 7
    $sTmp &= $aData[$i][$j] & '|'
    Next
    GUICtrlCreateListViewItem(StringTrimRight($sTmp, 1), $hListview)
    EndIf
    Next
    EndIf
    EndSwitch
    WEnd

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $aMousePos, $hItem, $tNMTREEVIEW = DllStructCreate($tagNMTREEVIEW, $ilParam)
    If DllStructGetData($tNMTREEVIEW, 'hWndFrom') = $hWndTreeview Then
    Switch DllStructGetData($tNMTREEVIEW, 'Code')
    Case $NM_CLICK
    GUICtrlSendToDummy($hDummyTreeview)
    EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func _GUICtrlTreeView_FindParent($hTreeview, $sSearch, $hRoot)
    Local $sText, $hItem, $hNextSibling = _GUICtrlTreeView_GetFirstChild($hTreeview, $hRoot) ; Handle vom ersten Child
    If $hNextSibling = 0 Then Return $hItem ; wenn kein Child vorhanden, dann verlassen
    Do
    $sText = _GUICtrlTreeView_GetText($hTreeview, $hNextSibling) ; Text vom TreeView-Item auslesen
    If StringInStr($sSearch, $sText) Then ; wenn der Text im Suchwort enthalten ist, dann...
    If _GUICtrlTreeView_GetChildCount($hTreeview, $hNextSibling) > 0 Then $hItem = _GUICtrlTreeView_FindParent($hTreeview, $sSearch, $hNextSibling) ; falls das Item noch Childs besitzt, die Funktion rekursiv aufrufen
    If $hItem > 0 Then Return $hItem ; wenn der rekursive Aufruf, bereits einen Treffer brachte, dann die Funktion verlassen
    $hItem = $hNextSibling ; der Text war im Suchwort vorhanden, also ist $hItem schonmal ein Treffer
    EndIf
    If $sSearch = $sText Then $hItem = -1 ; wenn das Suchwort gleich dem Text ist, dann gibt es den Eintrag bereits
    $hNextSibling = _GUICtrlTreeView_GetNextSibling($hTreeview, $hNextSibling) ; nächsten Sibling für die Suche benutzen
    Until $hNextSibling = 0 ; Schleife wiederholen, solange noch ein Sibling vorhanden
    Return $hItem
    EndFunc ;==>_GUICtrlTreeView_FindParent

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

    Func Create2DArray($string, $delimiter = "|")
    If $string = "" Then Return SetError(1, 0, 0)
    Local $aTemp = StringRegExp($string, "(.*\" & $delimiter & ".*)", 3), $aTmp, $i, $j
    Local $2DArray[UBound($aTemp)][8]
    For $i = 0 To UBound($aTemp) - 1
    $aTmp = StringSplit($aTemp[$i], $delimiter)
    For $j = 1 To $aTmp[0]
    $2DArray[$i][$j - 1] = $aTmp[$j]
    Next
    Next
    _ArraySort($2DArray, 0, 0, 0, 1)
    Return SetError(0, 0, $2DArray)
    EndFunc ;==>Create2DArray

    [/autoit]
  • 8o genau so wollte ich es haben! :thumbup:

    Ich will ein Tool basteln, womit man Shares von einem Server zu einem anderen Server umziehen kann (Migration)!

    Vielen, vielen DANK Oscar!

    Ich komme der Sache jetzt wesentlich näher! :D

    Ich werde diesen Beitrag zunächst offen lassen, falls ich noch Fragen habe!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯