C# ListView组标题单击-在Windows 7中禁用全选
在XP中单击ListView的组标题时,不会发生任何事情。 在Windows 7中单击ListView的组标题时,将选中该组中的所有项目。 我无法在Windows Vista上测试,因为我没有计算机 如何通过点击Windows7(或者Vista)中引入的组标题来禁用“全选” 如果用户愿意,应该仍然允许用户选择多个甚至所有项目,而不是通过单击组标题 对于不建议使用替代列表视图(如ObjectListView)的答案,我们将不胜感激 我没有使用WPF 使现代化 作为一个测试,我尝试在ListView的mouse up事件中添加一个命中测试,以查看组标题是否被单击,以及是否取消选择所有项目 在XP中运行时,这将执行所需的效果。在Windows7中,它仍然选择该组中的所有项目 更新2C# 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
找到的解决方案:。以下是您可以执行的操作:
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);
}
}