ListView SelectedIndices vs CheckedIndices:为什么CheckedIndices属性缺少Clear方法?

时间:2014-02-24 15:24:38

标签: c# .net winforms listview

我有一个已编写的WinForm代码(使用.NET 4.5编译),我需要进行一些修改。

特别是我有一些ListView个对象,我通过将相关的CheckBoxes属性设置为True来启用复选框。 因此,我在代码中的每个地方都更改了listview.SelectedItems属性与listview.CheckedItems属性的使用,但我仍然有一些问题需要理解SelectedIndices与{{1}之间的差异}} property:为什么CheckedIndices属性没有Clear方法? 从this MSDN page开始,我了解ListView.CheckedIndices方法只是清除所有选定的项目",那么为什么它也无法清除所有"已检查过的"项目?这有什么替代或解决方法吗?或者我可能只是错过了与#34;检查"一起使用的等效方法。项目而不是"选择"的?

编辑:添加示例代码以清除我要求的内容

我有这样的代码:

Clear

现在我需要使用" Checked"状态:

ListView listViewDays, listViewDaysNumbers; // Initialized in standard "InitializeComponent" method

listViewDays.ItemSelectionChanged += (s, e) =>
{
    listViewDaysNumbers.SelectedIndices.Clear();
    // do something else
};

listViewDaysNumbers.ItemSelectionChanged += (s, e) =>
{
    listViewDays.SelectedIndices.Clear();
    // do something else
};

1 个答案:

答案 0 :(得分:4)

  

我已经考虑过for-each循环

不是 .NET中的所有都有一个方便的方法,这个方法没有。但是对于微软添加一个东西要说的话,for-each循环不是正确的解决方案。请记住,当您迭代集合并取消选中项目时,您也修改集合。这从来都不是很好。

所以你不应该使用for-each循环。从技术上讲,你可以使用for(;;)循环,但你必须向后迭代。我通常更喜欢使用while循环,因为它暴露了为什么你这样做的原因最好:

    while (listView1.CheckedItems.Count > 0) {
        listView1.CheckedItems[0].Checked = false;
    }

如果你发现这太过光栅,那么for-each循环就可以工作,但是你必须复制一下这个列表。一个无法通过循环修改的内容:

    foreach (ListViewItem item in listView1.CheckedItems.OfType<ListViewItem>().ToArray()) {
        item.Checked = false;
    }

如果您这样做是为了防止项目被检查,那么更简单的方法是:

    private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e) {
        e.Item.Checked = false;
    }