【发布时间】:2019-01-10 12:54:16
【问题描述】:
我有一个 ListView,其属性 CheckBoxes 设置为 true 并具有以下事件处理程序:
private void listView1_ItemCheck(object sender, ItemCheckEventArgs e)
{
listView1.Items[e.Index].Selected = e.NewValue == CheckState.Checked ? true : false;
}
使用键盘:
我可以使用箭头键向左或向右移动选择,并使用空格键(取消)选中一个项目。我可以使用 Shift + 箭头键选择多个项目。
问题:当按下空格键取消选中其中一个选中的项目时,选择会自动设置为单个项目,即当前聚焦的项目。
使用鼠标:
选择和检查元素似乎是同步的,直到我检查两个项目,然后左键单击其两个复选框中的一个复选框,时刻清除并检查的项目都不会被选中。
截图示例:
初始状态:
然后左键单击第一个复选框,然后左键单击第二个复选框:
然后左键单击两个复选框中的任何一个后,再次进入初始状态:
预期行为:两个复选框之一(上一步中未单击的那个)应保持选中状态。
注意:我也希望能够使用 ListView 的其他视图、LabelEdit 属性、拖放、图标、多选、组。
我想到了知道复选框矩形坐标的可能性,并使用 MouseDown 事件,甚至绘制我自己的复选框,但也许有更简单或更好的方法。
更新 1: 在 Windows 10 文件资源管理器的文件资源管理器中,我可以启用一个功能,使之成为可能:
这里第一个文件夹(隐藏文件夹)是不勾选不选中的,第二个和第三个项目要么是通过checkbox要么是通过Ctrl+click,要么是两者都选择。
另一个截图:
我发现复选框和选择的分离没有用,我认为如果将它们组合起来对用户来说更直观。
我正在尝试使用选择以及复选框来选择要在我的应用程序中显示的组/文件夹。
更新2:关于this related question中发布的代码:
该代码中存在一些错误,其中一个如下:
重现步骤:
- 修改设计器代码,在 ListView 中总共添加 5 项。
- 在程序开始时,第一个项目被聚焦(既未选择也未选中)。
- 按右箭头键可将焦点移至第二项。
- 当我按住 Shift 并按右箭头键时,行为错误:选择并检查了第二项和第三项,并且在按住 Shift 的同时再次按右箭头后,只有
item3和item4被选中 - 更准确地说,item2和item3被选中,item3和item4被选中。松开 Shift 键并单击空白区域只会选中item3,而不会选中任何一个。
Aleksa Ristic 的回答有一些错误:
- 双击标签勾选/取消勾选,选择状态相反;
- 橡皮筋选择不选中复选框;
- 一旦通过单击标签选择了一个项目,选中它就会取消选择。
更新 3:
Aleksa Ristic 的回答还是有一些 bug,我现在看到了:
我启动程序然后我:
- 直接点击标签或复选框;
- 使用箭头键移动焦点;
- 按 Space 或尝试 Shift 选择;
我总是在同一行i.Selected = false;(靠近第 85 行)得到System.StackOverflowException。
当用户点击所有内容并取消选择时,我想让当前选择和选中的项目变为粗体,当用户点击所有内容时,选择和选中的项目被清除。
当用户点击一个标签时,我想要与点击该标签附近的复选框时相同的行为。
橡皮筋现在效果很好。
【问题讨论】:
-
这是
ListView的功能之一 - 您可以选择多个项目并通过单击复选框集体选中/取消选中它们。你到底想达到什么目的? -
我更新了我的问题以回答您的问题。谢谢。