0

我正在使用带有复选框的ObjectListView,我想在选定的项目上运行一个函数来删除它们。所以我尝试了这个方法,但它不起作用:

private List<Matricule> matrs;
private void button1_Click(object sender, EventArgs e)
        {
            //List<Song> s = this.olvSongs.CheckedObjects.Count;
            //MessageBox.Show(this.olvSongs.CheckedItems.Count + "  " + this.olvSongs.CheckedObjects.Count);

            string s = "";
            foreach (var item in olvMatrs.SelectedItems)
            {
                matrs.Remove((Matricule)item);
            }
this.olvSongs.SetObjects(matrs);
        }

我该怎么做这个任务。

4

2 回答 2

2

你谈论复选框。线

foreach (var item in olvMatrs.SelectedItems)

遍历选择的项目,而不是检查的!这真的是你想要的吗?要获得 CHECKED OBJECTS 使用

objectListView1.CheckedObjects

如果您真的想获得 SELECTED OBJECTS,请不要使用 Selected*Items*。利用

objectListView1.SelectedObjects;

反而。这就是 OLV 的全部意义所在。您想使用对象,而不是使用 ListViewItems。

如果您决定要删除的内容,请不要从您的列表中删除对象,而是直接从您的 ObjectListView 中使用

objectListView1.RemoveObjects(myObjects);

您可能应该(重新)阅读内容。尤其是“心理换档 - 这很重要。您需要了解这一点。”部分。

于 2013-11-14T08:50:48.913 回答
1

好吧,我看到您没有显示向 matrs 添加任何内容的代码,因此我们当然缺少有用的源代码。此外,我们不知道矩阵是什么,但我可以很好地猜测您已经分享的内容。

我相信如果 matrs 没有移除任何物品,则必须发生 3 件事中的 1 件事。

1:您确定您的功能与按钮的点击事件相关联吗?您可以在函数中设置断点以确保它甚至正在执行。或者您可以添加一行以MessageBox.Show("Yes", this.Text);在该 button1_Click() 方法中显示一个消息框。

2:如果函数正在执行(所以它不是选项#1),那么我的第二个考虑是可能(Matricule)item不在 matrs 列表中可以被删除。该 Remove 函数返回一个布尔值,指示 remove 是否实际删除了某些内容。

3:你确定它没有被删除,真正发生的事情是它确实被删除了,但你的新更新列表没有显示给你?

我相信您认为它是#2,但可能希望首先消除其他 2 个更简单的选项(#1 和#3)的可能性。如果您确实推断它是#2,那么选项#1和#3没有发生,那么通过引用这些对象来删除对象就是这样:它很容易导致像您所拥有的那样的问题。很容易有代码实际上试图删除一个与另一个对象具有相同属性的新对象List. 我解决这个问题的干净方法是尝试通过索引 # 而不是对对象本身的引用来删除项目。但是您甚至没有从 List 本身中获取要删除的对象。您正在从另一个对象列表 olvMatrs 中获取该对象。从您共享的信息中,我最好的猜测是,这就是它不起作用的原因,如果您看得更深,您正在尝试删除不在列表中的对象,因此没有任何内容被删除。这是一个容易犯的错误。我只知道,因为在我学会对此非常小心之前,我也做过。

于 2013-11-13T15:51:29.270 回答