我想处理组标题单击事件。我使用这篇文章中的信息来实现我的目标。应用程序正确识别鼠标单击组标题,问题实际上是,如标题所述,SendMessage 方法返回的组 ID 对于某些组是错误的。
我的 ListView(我在上面测试了代码)如下所示:
Group 1
Item 1.1
Item 1.2
Group 2
Item 2.1
Item 2.2
Group 3
Item 3.1
基本上,在我单击第二组或第三组之前,它工作正常。单击组标题时,SendMethod 返回以下值: 0 代表Group 1
, 2 代表Group 2
和 3 代表Group 3
。
这是 WndProc 方法的实现:
protected override void WndProc(ref Message m)
{
bool passMessage = true;
if (m.Msg == WM_RBUTTONDOWN)
{
Point hitPoint = LParamToPoint(m.LParam);
LVHITTESTINFO lvHitTestInfo = new LVHITTESTINFO();
lvHitTestInfo.pt.x = hitPoint.X;
lvHitTestInfo.pt.y = hitPoint.Y;
int rtn = SendMessage(listView.Handle, LVM_SUBITEMHITTEST, -1, ref lvHitTestInfo);
if (rtn != -1)
{
if (((lvHitTestInfo.flags & LVHITTESTFLAGS.LVHT_EX_GROUP_HEADER) == LVHITTESTFLAGS.LVHT_EX_GROUP_HEADER))
{
passMessage = false;
string groupName;
if (rtn == listView.Groups.Count)
groupName = "default";
else
groupName = listView.Groups[rtn].Header;
GroupClicked.Invoke(listView, new ListViewInterceptorEventArgs(rtn, groupName));
}
}
}
if (passMessage)
base.WndProc(ref m);
}
我想显示与所选组相关的内容,所以我需要知道点击了哪一个。我正在使用 Windows 8。如果有人可以指导我找到解决方案,我将非常感激。如果您需要任何其他信息,请告诉我,我会为您提供。
PS 在我的应用程序中,我动态添加组,如下所示:
ListViewGroup contactsGroup = new ListViewGroup(group.id, group.name);
contactsGroup.Name = group.id;
contactsGroup.HeaderAlignment = HorizontalAlignment.Center;
lvContacts.Groups.Add(contactsGroup);
for (int i = 0; i < group.users.Count; i++)
{
ListViewItem lvi = new ListViewItem(group.users[i]);
lvi.SubItems.Add(group.userStatus[i] ? "ONLINE" : "offline");
lvi.Group = contactsGroup;
lvContacts.Items.Add(lvi);
}
相同的 WndProc 方法实现在另一个程序中工作得很好,我编写该程序只是为了测试这一点,并且我通过设计器添加了组。