Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# User32.dll';s SendMessage方法返回错误的ListViewGroup id_C#_Winforms_User32 - Fatal编程技术网

C# User32.dll';s SendMessage方法返回错误的ListViewGroup id

C# User32.dll';s SendMessage方法返回错误的ListViewGroup id,c#,winforms,user32,C#,Winforms,User32,我想处理组标题单击事件。我使用来自的信息来实现我的目标。应用程序正确地识别鼠标单击组标题,问题实际上是,正如标题所述,SendMessage方法返回的组id对于某些组是错误的 我的ListView(我在其上测试了代码)如下所示: Group 1 Item 1.1 Item 1.2 Group 2 Item 2.1 Item 2.2 Group 3 Item 3.1 ListViewGroup contactsGroup = new ListV

我想处理组标题单击事件。我使用来自的信息来实现我的目标。应用程序正确地识别鼠标单击组标题,问题实际上是,正如标题所述,SendMessage方法返回的组id对于某些组是错误的

我的ListView(我在其上测试了代码)如下所示:

Group 1
  Item 1.1
  Item 1.2
Group 2
  Item 2.1
  Item 2.2
Group 3
  Item 3.1
                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);
                }
基本上,在我点击第二组或第三组之前,它工作正常。单击“组标题发送”时,方法返回以下值:
组1的值为0,组2的值为2,组3的值为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);
    }
我想显示与所选组相关的内容,因此我需要知道单击了哪个组。我正在使用Windows8。如果有人能给我一个解决方案,我将非常感激。如果你需要任何其他信息,请让我知道,我会提供给你

另外,在我的应用程序中,我会动态添加组,如下所示:

Group 1
  Item 1.1
  Item 1.2
Group 2
  Item 2.1
  Item 2.2
Group 3
  Item 3.1
                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);
                }
ListViewGroup contactsGroup=新建ListViewGroup(group.id,group.name);
contactsGroup.Name=group.id;
contactsGroup.HeaderAlignment=水平对齐.Center;
lvContacts.Groups.Add(contactsGroup);
对于(int i=0;i
同样的WndProc方法实现在另一个程序中运行良好,我编写该程序只是为了测试这一点,在该程序中,我通过设计器添加了组。

2019年6月:这仍然是一个问题,微软显然还没有解决它

但是多亏了大卫·艾美我们才有了解决办法。 首先需要创建所有组并将其添加到listview

Dim MyLvg As ListViewGroup = New ListViewGroup With {.Header = "MyGroup1", .Name = "MyGroup1"}
MyLsv.Groups.Add(MyLvg)
只有在这之后才能添加项目


还发现,在这个阶段,如果从头声明一个新的ListViewItem并添加它,它将不起作用,但是在这里,您需要通过现有的ListView实例来创建它。然后把你的Lvi和你的Lsv连接起来,你就一切就绪了

Dim MyLvi As ListViewItem = MyLsv.Items.Add("This is my new item")
MyLvi.Group = MyLvg

最后,让我补充一下,我已经测试了6种将ListViewItems链接到ListViewGroups的方法,所有方法都正常工作

MyLvi.Group = MyLvg
MyLvi.Group = MyLsv.Groups(0)
MyLvi.Group = MyLsv.Groups("MyGroup1")

MyLvg.Items.Add(MyLvi)
MyLsv.Groups(0).Items.Add(MyLvi)
MyLsv.Groups("MyGroup1").Items.Add(MyLvi)
这似乎是合乎逻辑的,但我们仍然没有得到这些错误,所以我宁愿仔细检查

使用这种创建和链接组和项目的方式肯定会确保您避免LVHITTESTINFO 2019年6月出现的“坏组Id”问题:这仍然是一个问题,微软显然还没有解决它

但是多亏了大卫·艾美我们才有了解决办法。 首先需要创建所有组并将其添加到listview

Dim MyLvg As ListViewGroup = New ListViewGroup With {.Header = "MyGroup1", .Name = "MyGroup1"}
MyLsv.Groups.Add(MyLvg)
只有在这之后才能添加项目


还发现,在这个阶段,如果从头声明一个新的ListViewItem并添加它,它将不起作用,但是在这里,您需要通过现有的ListView实例来创建它。然后把你的Lvi和你的Lsv连接起来,你就一切就绪了

Dim MyLvi As ListViewItem = MyLsv.Items.Add("This is my new item")
MyLvi.Group = MyLvg

最后,让我补充一下,我已经测试了6种将ListViewItems链接到ListViewGroups的方法,所有方法都正常工作

MyLvi.Group = MyLvg
MyLvi.Group = MyLsv.Groups(0)
MyLvi.Group = MyLsv.Groups("MyGroup1")

MyLvg.Items.Add(MyLvi)
MyLsv.Groups(0).Items.Add(MyLvi)
MyLsv.Groups("MyGroup1").Items.Add(MyLvi)
这似乎是合乎逻辑的,但我们仍然没有得到这些错误,所以我宁愿仔细检查


使用这种创建和链接组和项目的方法肯定会确保您避免LVHITTESTINFO中的“坏组Id”问题,这将需要大量工作才能重新编写,成功几率非常低。如果你需要帮助调试这个问题,那么你必须创建一个有这个问题的最小复制项目,并将其发布到一个文件共享服务。我想也许有人也有同样的问题,并找到了解决办法,这样可以节省我一些时间,但我想我将不得不独自面对它。无论如何谢谢你!我知道这已经3岁了,但我刚刚遇到了同样的事情。我已经找到了一种方法让它工作,但它完全让我困惑到底发生了什么。如果先创建所有ListViewGroup对象,然后将它们添加到listview中,至少对我来说是这样。如果有人愿意,我可以发布代码示例。你好,大卫。这是一个被遗忘已久的解决方案,但当我有时间找到来源,采用新的VS/.NET和其他东西时,我会检查它:)谢谢你的输入。这将需要大量的工作来重新编写,成功的几率非常低。如果你需要帮助调试这个问题,那么你必须创建一个有这个问题的最小复制项目,并将其发布到一个文件共享服务。我想也许有人也有同样的问题,并找到了解决办法,这样可以节省我一些时间,但我想我将不得不独自面对它。无论如何谢谢你!我知道这已经3岁了,但我刚刚遇到了同样的事情。我已经找到了一种方法让它工作,但它完全让我困惑到底发生了什么。如果先创建所有ListViewGroup对象,然后将它们添加到listview中,至少对我来说是这样。如果有人愿意,我可以发布代码示例。你好,大卫。这是一个被遗忘已久的解决方案,但当我有时间找到源代码,采用新的VS/.NET和其他东西时,我会检查它:)感谢您的输入。