グループ ヘッダーのクリック イベントを処理したい。この投稿の情報を使用して、目標を達成しました。アプリケーションはグループ ヘッダーのマウス クリックを正しく認識しますが、実際の問題は、タイトルにあるように、SendMessage メソッドによって返されるグループ ID が一部のグループで間違っていることです。
私の ListView (コードをテストしたもの) は次のようになります。
Group 1
Item 1.1
Item 1.2
Group 2
Item 2.1
Item 2.2
Group 3
Item 3.1
基本的に、2 番目または 3 番目のグループをクリックするまでは問題なく動作します。グループ ヘッダーをクリックすると、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 メソッドの実装は、これをテストするためだけに作成し、デザイナーを介してグループを追加した別のプログラムでも問題なく動作します。