我有一个已编写的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
};
答案 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;
}