VC ++ Windows应用程序ListView删除所有选定的项目

时间:2015-03-15 22:08:58

标签: .net winforms listview visual-c++

我正在尝试从 listView1 中删除多个所选项目,但是在删除一个项目之后,该列表似乎没有得到更新,因此程序出现故障,即删除了一些错误的项目并跳过一些正确的。

删除一个项目后, GUI框会更新,即项目从框中消失。但是第一个之后的下一个项目不应该是它应该是什么。

示例:我选择索引为0,1,3,4

的项目

结果: 0被删除,然后删除3,然后删除5,即使我没有选择5。

注意:正确选择了项目(我测试过)。问题出在下面的代码中。

这是我的代码:

private: System::Void delSelected_LinkClicked(System::Object^  sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^  e)
{
    int count = listView1->SelectedItems->Count;
    ListView::SelectedIndexCollection^ indexes = this->listView1->SelectedIndices;
    System::Collections::IEnumerator^ myEnum1 = indexes->GetEnumerator();
    MessageBox::Show(count.ToString(), "MessageBox Test", MessageBoxButtons::OK, MessageBoxIcon::Information);

    while (myEnum1->MoveNext()) {
        int index = safe_cast<int>(myEnum1->Current);
        //MessageBox::Show(index.ToString()+". "+listView1->Items[index]->Text, "MessageBox Test", MessageBoxButtons::OK, MessageBoxIcon::Information);
        listView1->Items->Remove(listView1->Items[index]);
    }
}

我想知道在删除一个项目或任何其他解决方法后更新列表的方法。

感谢。

3 个答案:

答案 0 :(得分:1)

Listview项目的索引将被删除(即,它们在列表中的位置,从0到n-1)。

问题是,当删除列表视图项时,所有后续项都会向上移动一个位置。例如,如果删除项索引1,则先前索引为2的项将成为新索引1,依此类推。

解决方案是:

  • 跟踪已删除的项目数,并在删除每个后续项目时从索引中减去该总数,或
  • 按相反顺序删除项目

无论您选择哪种解决方案,都需要确保在开始之前对要删除的索引列表进行排序。

答案 1 :(得分:0)

这是一个直截了当的方式来赞美乔纳森的回答:

while (listView1->SelectedItems->Count > 0)
{
    listView1->Items->Remove(listView1->SelectedItems [0]);
}

答案 2 :(得分:0)

以下是我在Jonathan和Raheel的答案的帮助下做到的:

while (listView1->SelectedItems->Count > 0)
    listView1->Items->Remove(listView1->SelectedItems[0])