Listview: Item per Skript selektieren, Darstellung aber nicht grau - sondern, wie per Hand in blau

    • Offizieller Beitrag

    Ich suche in einem Listview nach einem Begriff. Der gefundene Eintrag wird selektiert - soll aber optisch so dargestellt werden, wie bei einer Selektion per Hand, also in blau.
    Die Skriptmöglichkeiten (.._SetItemFocused, .._SetItemSelected, .._SetHotItem, .._SetItemState:$LVIS_SELECTED) führen alle zu einer grauen Markierung.
    Ich möchte nicht extra per Customdraw das Item zeichnen. Falls jemand eine Lösung findet, immer her damit.

    Hier ein Bsp. mit den wesentlichen Teilen aus meinem Skript. Einfach in das Suchfeld einen Buchstaben von A-Z eingeben.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $aItem[26][2]
    For $i = 0 To 25
    $aItem[$i][0] = Chr(65+$i)
    $aItem[$i][1] = Random(1000, 9999, 1)
    Next

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

    $Form1 = GUICreate("Test", 800, 620, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    $iSearch = GUICtrlCreateInput('', 15, 10, 90, 20)
    $bSearch = GUICtrlCreateButton('Suchen', 125, 10, 150, 20, $BS_DEFPUSHBUTTON)
    GUICtrlSetOnEvent(-1, '_Search')
    $ListView1 = GUICtrlCreateListView("1|2", 15, 40, 770, 545, BitOR($LVS_SHOWSELALWAYS,$LVS_SINGLESEL,$WS_HSCROLL,$WS_VSCROLL))
    GUICtrlSetOnEvent(-1, "ListView1Click")
    GUICtrlSetBkColor(-1, 0xF0F8FF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
    GUICtrlSendMsg(-1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_ONECLICKACTIVATE, $LVS_EX_ONECLICKACTIVATE)
    $hWnd = GUICtrlGetHandle(-1)
    _GUICtrlListView_SetColumnWidth($hWnd, 0, 90)
    _GUICtrlListView_SetColumnWidth($hWnd, 1, $LVSCW_AUTOSIZE_USEHEADER)

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

    _LV_Fill()
    GUISetState(@SW_SHOW, $Form1)

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

    GUIRegisterMsg($WM_NOTIFY, "MY_WM_COMMAND")

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

    While 1
    Sleep(100)
    WEnd

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

    Func Form1Close()
    Exit
    EndFunc

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

    ; ========================================================================================
    ; == Die Funktion sucht nach dem eingegebenen Text in der ersten Spalte
    ; == wenn gefunden soll die Zeile blau markiert werden, wie beim Draufklicken per Hand
    Func _Search()
    $txt = GUICtrlRead($iSearch)
    If $txt = '' Then Return
    Local $indx = _LV_FindInSubItem($hWnd, $txt, 0)
    If $indx = -1 Then Return
    ControlClick("", "", $ListView1) ;<<== DAS bringt den gewünschten Erfolg!!
    _GUICtrlListView_EnsureVisible($hWnd, $indx)
    _GUICtrlListView_SetItemSelected($hWnd, $indx)
    _GUICtrlListView_SetItemFocused($hWnd, $indx)
    EndFunc ;==>_Search
    ; ========================================================================================

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

    Func _LV_Fill()
    GUISetState(@SW_LOCK, $Form1)
    For $i = 0 To 25
    GUICtrlCreateListViewItem('|', $ListView1)
    GUICtrlSetBkColor(-1, 0xE6E8FA)
    _GUICtrlListView_SetItemText($hWnd, $i, $aItem[$i][0], 0)
    _GUICtrlListView_SetItemText($hWnd, $i, $aItem[$i][1], 1)
    Next
    GUISetState(@SW_UNLOCK, $Form1)
    EndFunc ;==>_LV_Fill

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

    Func _LV_FindInSubItem($hWnd, $2Find, $SubIndex)
    Local $out = -1
    For $i = 0 To _GUICtrlListView_GetItemCount($hWnd) - 1
    If _GUICtrlListView_GetItemText($hWnd, $i, $SubIndex) = $2Find Then
    $out = $i
    ExitLoop
    EndIf
    Next
    Return $out
    EndFunc ;==>_LV_FindInSubItem

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

    Func ListView1Click()
    Local $indx = _GUICtrlListView_GetHotItem($hWnd)
    GUICtrlSetData($iSearch, _GUICtrlListView_GetItemText($hWnd, $indx, 0))
    EndFunc ;==>ListView1Click

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

    Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Switch $wParam
    Case $ListView1
    Local $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return $GUI_RUNDEFMSG
    If DllStructGetData($tagNMHDR, 3) = $NM_CLICK Then ListView1Click()
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_COMMAND

    [/autoit]

    Danke an UEZ für den entscheidenen Hinweis: s. Zeile 50

  • Hallo BugFix,

    am einfachsten ist es wenn du der LV den Focus gibst:

    [autoit]

    ; ========================================================================================
    ; == Die Funktion sucht nach dem eingegebenen Text in der ersten Spalte
    ; == wenn gefunden soll die Zeile blau markiert werden, wie beim Draufklicken per Hand
    Func _Search()
    $txt = GUICtrlRead($iSearch)
    If $txt = '' Then Return
    Local $indx = _LV_FindInSubItem($hWnd, $txt, 0)
    If $indx = -1 Then Return
    _GUICtrlListView_EnsureVisible($hWnd, $indx)
    _GUICtrlListView_SetItemSelected($hWnd, $indx)
    _GUICtrlListView_SetItemFocused($hWnd, $indx) ; wirkungslos
    _GUICtrlListView_SetHotItem($hWnd, $indx) ; wirkungslos
    ;~ _GUICtrlListView_SetItemState($hWnd, $indx, $LVIS_SELECTED, $LVIS_SELECTED) ; wirkungslos
    ControlFocus($Form1,"",$ListView1)
    EndFunc ;==>_Search
    ; =======================================================================================

    [/autoit]

    Die andere Methode wäre mit der bei dir gesehenen Methode [LV (Sub-) Items einzeln färben] die entsprechende Zeile einzufärben,

    mfg autoBert