Что нового

Listview - корректное удаление items, отмеченных галочками в чекбоксах

saavaage

Знающий
Сообщения
171
Репутация
17
Суть - есть listview с чекбоксами. Стоит задача - удаление всех items, отмеченных галочками.

Я решаю это через функцию:
Код:
Func _Delete()

	For $d =0 To _GUICtrlListView_GetItemCount($ListView_DictEdit) ; получение кол-ва строк
		For $d1 =0 To _GUICtrlListView_GetItemCount($ListView_DictEdit)
		 If _GUICtrlListView_GetItemChecked($ListView_DictEdit, $d1)=1 Then ; если найдена строка с галочкой в чекбоксе, то
			_GUICtrlListView_DeleteItem(GUICtrlGetHandle($ListView_DictEdit), $d1) ; удалить эту строку из listview и выйти из цикла
            ExitLoop
	   	 Endif
		Next
	Next

EndFunc

Есть ли более изящное решние (не через двойной цикл)?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
saavaage
А так разве не удаляет?
Код:
Func _Delete()
	$hListView = GUICtrlGetHandle($ListView_DictEdit)
	For $i = 0 To _GUICtrlListView_GetItemCount($hListView) - 1
		If _GUICtrlListView_GetItemChecked($hListView, $i) Then
			_GUICtrlListView_DeleteItem($hListView, $i)
		EndIf
	Next
EndFunc   ;==>_Delete
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
madmasles, когда удаляешь один item - никаких проблем... Но когда все или очень много, то проблема возникает, т.к. идет постоянное обновление списка + $i постоянно увеличивается на 1: т.е. при $I - сначала удаляется сначала 0 item списка, потом при следующем проходе - 1 item списка, а нулевой нового списка уже не удаляется... и так далее. Немного сумбурно объяснил, но надеюсь понятно...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
saavaage
У меня так удаляет отмеченные:
Код:
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>

GUICreate("Test", 400, 400)
$Button1 = GUICtrlCreateButton("Button1", 40, 300, 169, 33)
$hListView = GUICtrlCreateListView("", 2, 2, 394, 268)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
GUISetState()
_GUICtrlListView_AddColumn($hListView, "Column 1", 100)

For $i = 1 To 10
	_GUICtrlListView_AddItem($hListView, "Row" & $i, 0)
Next

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			_Delete()
	EndSwitch
WEnd

Func _Delete()
	If Not IsHWnd($hListView) Then
		$hListView = GUICtrlGetHandle($hListView)
	EndIf
	For $i = _GUICtrlListView_GetItemCount($hListView) - 1 To 0 Step -1
		If _GUICtrlListView_GetItemChecked($hListView, $i) Then
			_GUICtrlListView_DeleteItem($hListView, $i)
		EndIf
	Next
EndFunc   ;==>_Delete
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
saavaage [?]
удаляется сначала 0 item списка, потом при следующем проходе - 1 item списка, а нулевой нового списка уже не удаляется... и так далее
Нужно удалять с конца:

Код:
Func _Delete()
    $hListView = GUICtrlGetHandle($ListView_DictEdit)
    
    For $i = _GUICtrlListView_GetItemCount($hListView) - 1 To 0 Step -1
        If _GUICtrlListView_GetItemChecked($hListView, $i) Then
            _GUICtrlListView_DeleteItem($hListView, $i)
        EndIf
    Next
EndFunc
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
CreatoR, ну почему я сам не додумался?!!! :smile:
Спасибо!
 
Верх