Удаление всех выбранных строк в 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--);
    }
}

Updated: более лаконичная версия по мотивам комментариев

    long item = -1;
    while((item = m_list->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)) != wxNOT_FOUND)
        m_list->DeleteItem(item--);
Related:

2 Responses to “Удаление всех выбранных строк в wxListCtrl”

  1. А если элемент с индексом 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);
    }
    }

    Ну или можно в массив собрать все выделения и удалять, начиная с конца (чтобы индексы выделенных элементов не менялись).

  2. ZeroDivisi0n: А если элемент с индексом 0 будет выделен оно будет работать (непонятно на что будет указывать item–)?

    будет конечно, постфиксный декремент – сначала отдает найденную item и только потом уменьшает ее.

    ZeroDivisi0n: 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);
    }
    }

    Да так тоже работает, но моя версия “оптимизированее”, мелочь но душу греет 🙂 А твой – кратка, в результате я ее решил скрестить, сейчас обновлю пост.

    ZeroDivisi0n: Ну или можно в массив собрать все выделения и удалять, начиная с конца (чтобы индексы выделенных элементов не менялись).

    Да можно, и оказывается я даже так уже делал, только забыл 🙂
    http://begemotov.net/wxwidgets/programming/wxmenu-s-ikonkami-i-obhod-vyidelennyih-atemov/

    Но все таки этот код короче.