mehrere listviews sortieren

  • Hiho,

    ich habe 1 gui und momentan 2 listviews ... aber es lässt sich nur eines sortieren.
    letzter versuch war so, bringt aber auch kein ergebnis ...

    [autoit]


    $Tab = GUICtrlCreateTab(0, 0, $w, $h)
    GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
    $TabSheet1 = GUICtrlCreateTabItem("Windows")
    $ListView1 = GUICtrlCreateListView("", 3, 23, $w - 5, $h - 28, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT));BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_SUBITEMIMAGES, $WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_HEADERDRAGDROP,$LVS_EX_FULLROWSELECT))
    $exStyles = BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_HEADERDRAGDROP)
    _GUICtrlListView_SetExtendedListViewStyle($ListView1, $exStyles)
    GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKAUTO)
    $GetListViewHandle = GUICtrlGetHandle($ListView1)

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

    ...

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

    $TabSheet3 = GUICtrlCreateTabItem("Process")
    $ListView3 = GUICtrlCreateListView("", 3, 23, $w - 5, $h - 28, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT));BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_SUBITEMIMAGES, $WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_HEADERDRAGDROP,$LVS_EX_FULLROWSELECT))
    $exStyles = BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_HEADERDRAGDROP)
    _GUICtrlListView_SetExtendedListViewStyle($ListView3, $exStyles)
    GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKAUTO)
    $GetListViewHandle3 = GUICtrlGetHandle($ListView3)

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

    ...

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    _GUICtrlListView_SetColumnOrder($ListView1, $wo)
    _GUICtrlListView_SetColumnOrder($ListView3, $po)
    _GUICtrlListView_RegisterSortCallBack($ListView1)
    _GUICtrlListView_RegisterSortCallBack($ListView3)

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

    ...

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

    $hListView = $ListView1
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $LVN_COLUMNCLICK ; A column was clicked
    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    $CurTab = _GUICtrlTab_GetCurSel($Tab)
    If $CurTab = 0 Then
    Local $B_DESCENDING[_GUICtrlListView_GetColumnCount ($ListView1) ]
    _GUICtrlListView_SortItems($hWndFrom, DllStructGetData($tInfo, "SubItem"))
    ElseIf $CurTab = 1 Then
    Local $B_DESCENDING[_GUICtrlListView_GetColumnCount ($ListView3) ]
    _GUICtrlListView_SortItems($hWndFrom, DllStructGetData($tInfo, "SubItem"))
    EndIf
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]
    • Offizieller Beitrag

    Hi,
    der Fehler liegt in der Sortiervariable ($B_DESCENDING). Diese wird nur vorab und nicht in der Funktion festgelegt.
    Wenn du 2 LV hast brauchst du zwei unterschiedlich Sortiervariablen.
    Hier mal ein Bsp.:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $hListView, $B_DESCENDING, $hListView1, $A_DESCENDING
    GUICreate("ListView SimpleSort", 400, 600)
    $hListView = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 268)
    GUICtrlSendMsg($hListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($hListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlCreateListViewItem("line4|5|more_a", $hListView)
    GUICtrlCreateListViewItem("line5|4.50 |more_c", $hListView)
    GUICtrlCreateListViewItem("line5|4.0 |more_c", $hListView)
    GUICtrlCreateListViewItem("line3|23|more_e", $hListView)
    GUICtrlCreateListViewItem("line2|0.34560 |more_d", $hListView)
    GUICtrlCreateListViewItem("line1|1.0 |more_b", $hListView)
    GUICtrlCreateListViewItem("line1|0.1 |more_b", $hListView)
    GUICtrlCreateListViewItem("line1|10|more_b", $hListView)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 75)
    _GUICtrlListView_SetColumnWidth($hListView, 1, 75)
    _GUICtrlListView_SetColumnWidth($hListView, 2, 75)
    $hListView1 = GUICtrlCreateListView("col1|col2|col3", 2, 300, 394, 268)
    GUICtrlSendMsg($hListView1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($hListView1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlCreateListViewItem("line1|X|more_T", $hListView1)
    GUICtrlCreateListViewItem("line2|Z|more_S", $hListView1)
    GUICtrlCreateListViewItem("line3|A|more_P", $hListView1)
    _GUICtrlListView_SetColumnWidth($hListView1, 0, 75)
    _GUICtrlListView_SetColumnWidth($hListView1, 1, 75)
    _GUICtrlListView_SetColumnWidth($hListView1, 2, 75)
    GUISetState()

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($hListView)]
    Global $A_DESCENDING[_GUICtrlListView_GetColumnCount($hListView1)]

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $hWndListView1, $tInfo
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    $hWndListView1 = $hListView1
    If Not IsHWnd($hListView1) Then $hWndListView1 = GUICtrlGetHandle($hListView1)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    If ($hWndFrom = $hWndListView) And ($iCode = $LVN_COLUMNCLICK) Then
    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    _GUICtrlListView_SimpleSort($hWndListView, $B_DESCENDING, DllStructGetData($tInfo, "SubItem"))
    ElseIf ($hWndFrom = $hWndListView1) And ($iCode = $LVN_COLUMNCLICK) Then
    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    _GUICtrlListView_SimpleSort($hWndListView1, $A_DESCENDING, DllStructGetData($tInfo, "SubItem"))
    EndIf
    EndFunc ;==>WM_NOTIFY

    [/autoit]
  • ah super, dank dir ... habs mit deiner anleitung hinbekommen. zwar etwas anders, aber es klappt *g*

    aber wo grad so ein fachmann da ist ... ich hab da noch ein viel größeres prob, was mich den ganzen tag schon aufhält.
    gleiches script wie oben, also gleicher aufbau.

    ich habe ein kontextmenü für listview1 erstellt, was auch tadellos funktioniert hat. jetzt, wo ich das 2te listview eingegliedert habe, funktioniert das kontextmenü nicht mehr. das menü wird korrekt in listview1 angezeigt, die funktionen selber sind auch ok (aufruf per hotkey funktioniert).

    was nicht geht ist quasi GuiCtrlSetOnEvent ... es wird garnicht erst in die Funktion gesprungen (OnEventMode ist jedoch auf 1).
    das ist, was ich bis jetzt rausfinden konnte, jedoch noch nicht genau, warum es plötzlich nicht mehr geht.

    wenn es denn wieder geht, will ich auf für das neue listview ein eigenes kontextmenü erstellen.

    kontextmenü ist so aufgebaut:

    [autoit]

    $ContextMenu = GUICtrlCreateContextMenu($ListView1)
    $Rename_Window = GUICtrlCreateMenuItem("Rename Window", $ListView1)
    GUICtrlSetOnEvent(-1, "_Rename_Window")
    $Set_Trans = GUICtrlCreateMenuItem("Set Transparency", $ListView1)
    GUICtrlSetOnEvent(-1, "_Set_Trans")
    $Set_OnTop = GUICtrlCreateMenuItem("On Top", $ListView1)
    GUICtrlSetOnEvent(-1, "_Set_OnTop")

    [/autoit]

    was ist falsch???

    • Offizieller Beitrag

    $ContextMenu = GUICtrlCreateContextMenu($ListView1)
    $Rename_Window = GUICtrlCreateMenuItem("Rename Window", $ListView1)
    GUICtrlSetOnEvent(-1, "_Rename_Window")
    $Set_Trans = GUICtrlCreateMenuItem("Set Transparency", $ListView1)
    GUICtrlSetOnEvent(-1, "_Set_Trans")
    $Set_OnTop = GUICtrlCreateMenuItem("On Top", $ListView1)
    GUICtrlSetOnEvent(-1, "_Set_OnTop")

    Das paßt aber gar nicht zueinander.

  • so hat es zumindest funktioniert ... ok, da hatte ich noch

    [autoit]

    $ContextM = GUICtrlCreateContextMenu()

    [/autoit]

    unter $listview1 stehen.

    hab das mal weggemacht und das menu ans kontextmenü gehängt. es wird zwar angezeigt, aber passieren tut trotzdem nichts =/

    [autoit]

    $ListView1 = GUICtrlCreateListView("", 3, 23, $w - 5, $h - 28, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT));BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_SUBITEMIMAGES, $WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_HEADERDRAGDROP,$LVS_EX_FULLROWSELECT))
    $exStyles = BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_HEADERDRAGDROP)
    _GUICtrlListView_SetExtendedListViewStyle($ListView1, $exStyles)
    GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKAUTO)
    $GetListViewHandle = GUICtrlGetHandle($ListView1)

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

    $ContextMenu = GUICtrlCreateContextMenu($ListView1)
    $Rename_Window = GUICtrlCreateMenuItem("Rename Window", $ContextMenu)
    GUICtrlSetOnEvent(-1, "_Rename_Window")
    $Set_Trans = GUICtrlCreateMenuItem("Set Transparency", $ContextMenu)
    GUICtrlSetOnEvent(-1, "_Set_Trans")
    $Set_OnTop = GUICtrlCreateMenuItem("On Top", $ContextMenu)
    GUICtrlSetOnEvent(-1, "_Set_OnTop")
    $Set_Visible = GUICtrlCreateMenuItem("Visible", $ContextMenu)
    GUICtrlSetOnEvent(-1, "_Set_Visible")

    [/autoit]
    • Offizieller Beitrag

    Hast du auch Opt('GUIOnEventMode', 1) gesetzt?

    Ich hab mal in das Sortierbsp. zwei Kontextmenüs eingebaut. Funzt tadellos.

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)
    Opt('MustDeclareVars', 1)

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

    Global $hListView, $B_DESCENDING, $hListView1, $A_DESCENDING, $conmnu1, $conmnu2
    GUICreate("ListView SimpleSort", 400, 600)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_close')
    $hListView = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 268)
    $conmnu1 = GUICtrlCreateContextMenu($hListView)
    GUICtrlCreateMenuItem('Item1', $conmnu1)
    GUICtrlSetOnEvent(-1, '_I1_1')
    GUICtrlCreateMenuItem('Item2', $conmnu1)
    GUICtrlSetOnEvent(-1, '_I1_2')
    GUICtrlSendMsg($hListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($hListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlCreateListViewItem("line4|5|more_a", $hListView)
    GUICtrlCreateListViewItem("line5|4.50 |more_c", $hListView)
    GUICtrlCreateListViewItem("line5|4.0 |more_c", $hListView)
    GUICtrlCreateListViewItem("line3|23|more_e", $hListView)
    GUICtrlCreateListViewItem("line2|0.34560 |more_d", $hListView)
    GUICtrlCreateListViewItem("line1|1.0 |more_b", $hListView)
    GUICtrlCreateListViewItem("line1|0.1 |more_b", $hListView)
    GUICtrlCreateListViewItem("line1|10|more_b", $hListView)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 75)
    _GUICtrlListView_SetColumnWidth($hListView, 1, 75)
    _GUICtrlListView_SetColumnWidth($hListView, 2, 75)
    $hListView1 = GUICtrlCreateListView("col1|col2|col3", 2, 300, 394, 268)
    $conmnu2 = GUICtrlCreateContextMenu($hListView1)
    GUICtrlCreateMenuItem('Item1', $conmnu2)
    GUICtrlSetOnEvent(-1, '_I2_1')
    GUICtrlCreateMenuItem('Item2', $conmnu2)
    GUICtrlSetOnEvent(-1, '_I2_2')
    GUICtrlSendMsg($hListView1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($hListView1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlCreateListViewItem("line1|X|more_T", $hListView1)
    GUICtrlCreateListViewItem("line2|Z|more_S", $hListView1)
    GUICtrlCreateListViewItem("line3|A|more_P", $hListView1)
    _GUICtrlListView_SetColumnWidth($hListView1, 0, 75)
    _GUICtrlListView_SetColumnWidth($hListView1, 1, 75)
    _GUICtrlListView_SetColumnWidth($hListView1, 2, 75)
    GUISetState()

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($hListView)]
    Global $A_DESCENDING[_GUICtrlListView_GetColumnCount($hListView1)]

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

    While True
    Sleep(100)
    WEnd

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

    Func _close()
    Exit
    EndFunc

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

    Func _I1_1()
    MsgBox(0, '', 'I1-1')
    EndFunc

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

    Func _I1_2()
    MsgBox(0, '', 'I1-2')
    EndFunc

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

    Func _I2_1()
    MsgBox(0, '', 'I2-1')
    EndFunc

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

    Func _I2_2()
    MsgBox(0, '', 'I2-2')
    EndFunc

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $hWndListView1, $tInfo
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    $hWndListView1 = $hListView1
    If Not IsHWnd($hListView1) Then $hWndListView1 = GUICtrlGetHandle($hListView1)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    If ($hWndFrom = $hWndListView) And ($iCode = $LVN_COLUMNCLICK) Then
    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    _GUICtrlListView_SimpleSort($hWndListView, $B_DESCENDING, DllStructGetData($tInfo, "SubItem"))
    ElseIf ($hWndFrom = $hWndListView1) And ($iCode = $LVN_COLUMNCLICK) Then
    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    _GUICtrlListView_SimpleSort($hWndListView1, $A_DESCENDING, DllStructGetData($tInfo, "SubItem"))
    EndIf
    EndFunc ;==>WM_NOTIFY

    [/autoit]
  • hatte diese nacht auch nen geistesblitz.
    ich weiss nicht, ob es wirklich so sein soll (kann ich mir nicht vorstellen), aber dann ist es ein autoit-bug.

    ich habe erst die listviews erstellt und danach das contextmenü, welches ich aber listview 1 zugeordnet habe.
    das geht nicht.

    erstelle ich listview 1, danach das kontextmenü und dann listview2 + kontextmenü, dann geht alles ...

    thx 4 help