Удаление всех выбранных строк в wxListCtrl
March 24th, 2010 Begemot Posted in Программирование
На первый взгляд это кажется банальной процедурой, но у меня заработало только с третье или четвертой попытки, ибо есть особенности. Так что – code snippet :
void ClassName::OnDeleteClick(wxCommandEvent& event)
{
long item = -1;
while(true)
{
item = m_list->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
if (item == wxNOT_FOUND) break;
m_list->DeleteItem(item--);
}
}
{
long item = -1;
while(true)
{
item = m_list->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
if (item == wxNOT_FOUND) break;
m_list->DeleteItem(item--);
}
}
Updated: более лаконичная версия по мотивам комментариев
long item = -1;
while((item = m_list->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)) != wxNOT_FOUND)
m_list->DeleteItem(item--);
while((item = m_list->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)) != wxNOT_FOUND)
m_list->DeleteItem(item--);
March 24th, 2010 at 9:35 am
А если элемент с индексом 0 будет выделен оно будет работать (непонятно на что будет указывать item–)?
Можно попробовать вот такую реализацию:
void ClassName::OnDeleteClick(wxCommandEvent& event)
{
long item;
while((item = m_list->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)) !=wxNOT_FOUND )
{
m_list->DeleteItem(item);
}
}
Ну или можно в массив собрать все выделения и удалять, начиная с конца (чтобы индексы выделенных элементов не менялись).
March 24th, 2010 at 10:44 am
будет конечно, постфиксный декремент – сначала отдает найденную item и только потом уменьшает ее.
Да так тоже работает, но моя версия “оптимизированее”, мелочь но душу греет 🙂 А твой – кратка, в результате я ее решил скрестить, сейчас обновлю пост.
Да можно, и оказывается я даже так уже делал, только забыл 🙂
http://begemotov.net/wxwidgets/programming/wxmenu-s-ikonkami-i-obhod-vyidelennyih-atemov/
Но все таки этот код короче.