如何从ObjectListView c#中检索已检查的对象列表?

时间:2013-11-13 14:13:37

标签: c# objectlistview

我正在使用带有复选框的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);
        }

我该怎么做呢。

2 个答案:

答案 0 :(得分:2)

你谈的是复选框。这条线

foreach (var item in olvMatrs.SelectedItems)

遍历已选择的ITEMS,而不是CHECKED!这真的是你想要的吗? 要获得CHECKED OBJECTS,请使用

objectListView1.CheckedObjects

如果您确实想要获得SELECTED OBJECTS,请不要使用Selected * Items *。使用

objectListView1.SelectedObjects;

代替。这就是OLV的全部意义所在。您希望使用对象,而不是使用ListViewItems。

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

objectListView1.RemoveObjects(myObjects);

你应该(重新)阅读this。尤其是“精神齿轮转换 - 这很重要。你需要了解这一点。”。

答案 1 :(得分:1)

好吧,我发现你没有向代码添加任何东西到matrs,所以我们肯定缺少有用的源代码。此外,我们不知道Matricule是什么,但我可以很好地猜测你已经分享的内容。

我相信如果事件没有删除任何项目,必须发生3件事中的一件。

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

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

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

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