- 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
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
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
$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)
_LV_Fill()
GUISetState(@SW_SHOW, $Form1)
GUIRegisterMsg($WM_NOTIFY, "MY_WM_COMMAND")
[/autoit] [autoit][/autoit] [autoit]While 1
Sleep(100)
WEnd
Func Form1Close()
Exit
EndFunc
; ========================================================================================
; == 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
; ========================================================================================
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
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
Func ListView1Click()
Local $indx = _GUICtrlListView_GetHotItem($hWnd)
GUICtrlSetData($iSearch, _GUICtrlListView_GetItemText($hWnd, $indx, 0))
EndFunc ;==>ListView1Click
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
Danke an UEZ für den entscheidenen Hinweis: s. Zeile 50