1

グループ ヘッダーのクリック イベントを処理したい。この投稿の情報を使用して、目標を達成しました。アプリケーションはグループ ヘッダーのマウス クリックを正しく認識しますが、実際の問題は、タイトルにあるように、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 23 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 メソッドの実装は、これをテストするためだけに作成し、デザイナーを介してグループを追加した別のプログラムでも問題なく動作します。

4

1 に答える 1