1

在 XP 中单击 ListView 的组标题时,没有任何反应。在 Windows 7 中单击 ListView 的组标题时,该组中的所有项目都被选中。由于我没有机器,我无法在 Windows Vista 上进行测试。

如何通过单击 Windows 7(或 Vista)中引入的组标题来禁用“全选”。

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

不建议使用替代 ListViews(例如 ObjectListView)的答案将不胜感激!

我没有使用 WPF。

更新

作为测试,我尝试在 ListView 的鼠标向上事件中添加命中测试以查看是否单击了组标题以及是否取消选择所有项目。

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

更新 2

找到解决方案:见我的回答

4

3 回答 3

6

我已经想通了。

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

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);
    }
}

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

如果您需要更多功能,请使用switchonm.Msg而不是 using 。ifWndProc

于 2012-08-01T09:41:10.680 回答
1

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

于 2012-05-10T12:53:23.370 回答
0

这是您可以执行的操作:

listView.HeaderStyle = ColumnHeaderStyle.Nonclickable;

于 2012-05-10T10:54:22.780 回答