列表视图组标题单击 - 在 Windows 7 中禁用全选
本文关键字:全选 Windows 视图 标题 单击 列表 | 更新日期: 2023-09-27 18:33:40
在XP中单击ListView的组标题时,没有任何反应。在 Windows 7 中单击列表视图的组标题时,将选择此组中的所有项目。我无法在 Windows Vista 上进行测试,因为我没有计算机。
如何通过单击Windows 7(或Vista)中引入的组标题来禁用"全选"。
如果用户愿意,仍应允许用户选择多个甚至所有项目,只是不要通过单击组标题。
不建议使用替代列表视图(例如ObjectListView)的答案将不胜感激!
我没有使用 WPF。
更新
作为测试,我尝试在 ListView 的鼠标向上事件中添加命中测试,以查看是否单击了组标题以及是否要取消选择所有项目。
在XP中运行时,这将执行所需的效果。在 Windows 7 中,它仍然选择该组中的所有项目!
更新 2
找到的解决方案:看我的答案。
我已经想通了。
希望有人会发现这很有用——
在 MSDN 上的此线程中,有人试图创建一个事件来单击组标题。我已将其重新用于我的目的,如下所示(有关如何定义函数和常量的链接,请参阅链接):
public class MyListView : ListView
{
//
//some other code here, i.e. define constants, PInvoke, etc (see link)
//
protected override void WndProc(ref Message m)
{
//the link uses WM_LBUTTONDOWN but I found that it doesn't work
if (m.Msg == WM_LBUTTONUP)
{
LVHITTESTINFO info = new LVHITTESTINFO();
//The LParamToPOINT function I adapted to not bother with
// converting to System.Drawing.Point, rather I just made
// its return type the POINT struct
info.pt = LParamToPOINT(m.LParam);
//if the click is on the group header, exit, otherwise send message
if (SendMessage(this.Handle, LVM_SUBITEMHITTEST, -1, ref info) != -1)
if ((info.flags & LVHITTESTFLAGS.LVHT_EX_GROUP_HEADER) != 0)
return; //*
}
base.WndProc(ref m);
}
}
这允许识别单击,除非单击组标题。如果你想执行一些额外的功能,//*
你可以放置一个事件,等等。
如果需要更多WndProc
功能,请在m.Msg
上使用switch
,而不是使用if
。
如果不希望用户选择多个项目,则应将"多选"属性设置为 False。 这在XP和Vista+中都是一个问题,只需在单击第2项时按住Shift键即可。
以下是您可以执行的操作:
listView.HeaderStyle = ColumnHeaderStyle.Nonclickable;