列表视图组标题单击 - 在 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

找到的解决方案:看我的答案。

列表视图组标题单击 - 在 Windows 7 中禁用全选

我已经想通了。

希望有人会发现这很有用——

在 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;