C# 取消选择一个项目时,如何在System.Windows.Forms.ListView中保持其他项目处于选中状态
当您在C# 取消选择一个项目时,如何在System.Windows.Forms.ListView中保持其他项目处于选中状态,c#,.net,winforms,listview,multipleselection,C#,.net,Winforms,Listview,Multipleselection,当您在列表视图中选择了多个项目,并单击其中一个项目时,默认行为是取消选择所有其他项目,只保留已单击的项目。我想要完全相反的行为:单击其中一个选定的项目,只取消选择该项目,而保留其他选定项目 我见过像和这样的答案。第一个是关于阻止鼠标点击做任何明显不是我想要的事情,第二个是关于取消索引更改事件。我试着根据我的需要调整后一个项目,但它仍然会导致其他项目被取消选择 private void HandleIncludableFilesListViewSelectedIndexChanging (
列表视图中选择了多个项目,并单击其中一个项目时,默认行为是取消选择所有其他项目,只保留已单击的项目。我想要完全相反的行为:单击其中一个选定的项目,只取消选择该项目,而保留其他选定项目
我见过像和这样的答案。第一个是关于阻止鼠标点击做任何明显不是我想要的事情,第二个是关于取消索引更改事件。我试着根据我的需要调整后一个项目,但它仍然会导致其他项目被取消选择
private void HandleIncludableFilesListViewSelectedIndexChanging
(object sender, Controls.Events.ListViewItemChangingEventArgs e)
{
if (_includableFilesListView.Items[e.Index].Selected) e.Cancel = true;
}
上面的事件处理程序仅对单击的单个项目激发,而不是对取消选择的其他所有项目激发
private void HandleIncludableFilesListViewSelectedIndexChanging
(object sender, Controls.Events.ListViewItemChangingEventArgs e)
{
if (_includableFilesListView.Items[e.Index].Selected) e.Cancel = true;
}
有什么方法可以实现这一点吗?作为一个选项,您可以覆盖DefWndProc
并处理WM_LBUTTONDOWN
。然后执行命中测试并检查单击的点是否为项目,还原项目的Selected
属性:
public class MyListView : ListView
{
const int WM_LBUTTONDOWN = 0x0201;
protected override void DefWndProc(ref Message m)
{
if (m.Msg == WM_LBUTTONDOWN)
{
int x = (m.LParam.ToInt32() & 0xffff);
int y = (m.LParam.ToInt32() >> 16) & 0xffff;
var item = this.HitTest(x, y).Item;
if (item != null)
item.Selected = !item.Selected;
else
base.DefWndProc(ref m);
}
else
{
base.DefWndProc(ref m);
}
}
}