C# ListView组标题单击-在Windows 7中禁用全选

C# ListView组标题单击-在Windows 7中禁用全选,c#,windows-7,.net-3.5,C#,Windows 7,.net 3.5,在XP中单击ListView的组标题时,不会发生任何事情。 在Windows 7中单击ListView的组标题时,将选中该组中的所有项目。 我无法在Windows Vista上测试,因为我没有计算机 如何通过点击Windows7(或者Vista)中引入的组标题来禁用“全选” 如果用户愿意,应该仍然允许用户选择多个甚至所有项目,而不是通过单击组标题 对于不建议使用替代列表视图(如ObjectListView)的答案,我们将不胜感激 我没有使用WPF 使现代化 作为一个测试,我尝试在ListView

在XP中单击ListView的组标题时,不会发生任何事情。 在Windows 7中单击ListView的组标题时,将选中该组中的所有项目。 我无法在Windows Vista上测试,因为我没有计算机

如何通过点击Windows7(或者Vista)中引入的组标题来禁用“全选”

如果用户愿意,应该仍然允许用户选择多个甚至所有项目,而不是通过单击组标题

对于不建议使用替代列表视图(如ObjectListView)的答案,我们将不胜感激

我没有使用WPF

使现代化 作为一个测试,我尝试在ListView的mouse up事件中添加一个命中测试,以查看组标题是否被单击,以及是否取消选择所有项目

在XP中运行时,这将执行所需的效果。在Windows7中,它仍然选择该组中的所有项目

更新2
找到的解决方案:。

以下是您可以执行的操作:


listView.HeaderStyle=ColumnHeaderStyle.Nonclickable

以下是您可以做的:


listView.HeaderStyle=ColumnHeaderStyle.Nonclickable

如果不希望用户选择多个项目,则应将MultiSelect属性设置为False。这在XP和Vista+中都是一个问题,只需在单击第二项时按住Shift键即可。

如果不希望用户选择多个项,则应将MultiSelect属性设置为False。这在XP和Vista+中都是一个问题,单击第二项时按住Shift键。

我已经解决了

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

在中,有人试图创建一个用于单击组标题的事件。我已将此款项重新拨作以下用途():

这允许识别单击,除非单击组标题。如果您想执行一些额外的功能,可以在
/*
处放置事件等

如果您需要更多的
WndProc
功能,请在
m.Msg
上使用
开关,而不是使用
if

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

在中,有人试图创建一个用于单击组标题的事件。我已将此款项重新拨作以下用途():

这允许识别单击,除非单击组标题。如果您想执行一些额外的功能,可以在
/*
处放置事件等


如果您需要更多的
WndProc
功能,请在
m.Msg
上使用
开关
,而不是使用
if

谢谢,但我指的是组标题,而不是列标题。列标题必须保持可单击状态!谢谢,但我说的是组标题,不是列标题。列标题必须保持可单击状态!我需要能够手动选择多个项目,我只需要禁用在>XP中单击组标题的“全选”功能。对不起,这没有意义。通过按住Shift键并单击组中的项目,用户可以在XP上完成完全相同的任务。单击组标题只是一个方便的快捷方式。这不会破坏您的代码。好吧,不管怎样,我应该。您没有发布任何要查看的内容,因此目前无法确定您出现此问题的原因。问题是不允许用户选择所有项目,这不是问题。我试图禁止的是通过单击组标题选择所有项目。我需要能够手动选择多个项目,我只需要禁用在>XP中单击组标题的“全选”功能。抱歉,这没有意义。通过按住Shift键并单击组中的项目,用户可以在XP上完成完全相同的任务。单击组标题只是一个方便的快捷方式。这不会破坏您的代码。好吧,不管怎样,我应该。您没有发布任何要查看的内容,因此目前无法确定您出现此问题的原因。问题是不允许用户选择所有项目,这不是问题。我试图禁止的是通过点击组标题选择所有项目。谢谢,这太棒了!更进一步,当您将鼠标移到组上时,如何禁用行高亮显示效果?我想让一组行完全非交互。我想读一读这些常量(比如
WM_LBUTTONUP
),可能有一个用于鼠标的,但我不知道不必研究…谢谢,这太棒了!更进一步,当您将鼠标移到组上时,如何禁用行高亮显示效果?我想让一组行完全非交互。我会阅读这些常量(如
WM_LBUTTONUP
),可能有一个用于鼠标的,但我不知道不必研究。。。
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);
    }
}