【问题标题】:VC++ Windows Application ListView delete all selected itemsVC++ Windows Application ListView 删除所有选中项
【发布时间】:2015-03-15 22:08:58
【问题描述】:

我正在尝试从 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]);
    }
}

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    解决办法是:

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

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

    【讨论】:

    • 作为一个初学者,不知道名单上移了。我选择了按逆序删除的解决方案,它运行良好。感谢您准确准确的回答。
    【解决方案2】:

    以下是赞美乔纳森回答的直接方式:

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

    【讨论】:

    • 我不确定这段代码是否能正常工作。你不需要递减计数吗?而且,如果所选项目不在列表的开头,也不按连续顺序怎么办?检查我的答案,看看我是怎么做到的。
    • @ITFreak:首先,ListViewItemCollectionRemove 方法会自动递减它的Count 属性。其次,每次在列表视图中添加或删除行时,SelectedItems 属性也会更新。试一试。
    • 修正了一个错字,在所有三个地方都使用了SelectedItems
    • 还有一个错误,即 Remove 不是 SelectedItems 的成员。它是项目的成员。您的代码与该更正完美配合,谢谢。
    • @ITFreak:谢谢。更正了它。在没有 IDE 的情况下回答 SO 问题是不明智的 :)。
    【解决方案3】:

    在 Jonathan 和 Raheel 的回答的帮助下,我是这样做的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      相关资源
      最近更新 更多