C# 父面板的鼠标滚轮-从子面板传递事件

C# 父面板的鼠标滚轮-从子面板传递事件,c#,winforms,C#,Winforms,我有一个自定义面板,其中包含4个标签(在粘贴的示例中,我删除了我未使用的2个标签的定义)。 此自定义面板将动态添加到面板中,与数组中的记录数量相同。 父面板启用了水平滚动=false,因为我应该只垂直滚动。 一切正常,因为我可以在垂直滚动条上使用鼠标,并且可以滚动面板容器。但当我想使用鼠标滚轮滚动所有自定义面板(子对象)时,它什么也不做。 我在这个网站上尝试了许多对其他人有效的解决方案,但没有一个对我有效,我也不知道为什么 我了解到面板必须有焦点才能滚动,并且我必须在child中将onmouse

我有一个自定义面板,其中包含4个标签(在粘贴的示例中,我删除了我未使用的2个标签的定义)。 此自定义面板将动态添加到面板中,与数组中的记录数量相同。 父面板启用了水平滚动=false,因为我应该只垂直滚动。 一切正常,因为我可以在垂直滚动条上使用鼠标,并且可以滚动面板容器。但当我想使用鼠标滚轮滚动所有自定义面板(子对象)时,它什么也不做。 我在这个网站上尝试了许多对其他人有效的解决方案,但没有一个对我有效,我也不知道为什么

我了解到面板必须有焦点才能滚动,并且我必须在child中将onmouseheel事件传递给parent。但是我做不到,我不知道怎么做

我的自定义面板(子项):


如果控件不接受事件,那么它们将被传递给父控件

lblRecordNumber.Enabled = false;
lblRecordName.Enabled = false;
或者,您可以将滚动事件传递给包含称为父控件的控件

internal class myLabel : Label
{
    const int WM_MOUSEWHEEL = 0x020A;

    protected override void WndProc(ref Message m)
    {

        if (m.Msg == WM_MOUSEWHEEL)
            m.HWnd = this.Parent.Handle; 

        base.WndProc(ref m);
    }
}
并使用该控件

this.SetStyle(ControlStyles.Selectable, true);
this.TabStop = true;
这两行代码是在子控件(panel)的构造函数中编写的


谢谢@Hans Passant的评论。:)

早于Win10的Windows版本将鼠标滚轮通知发送到具有焦点的控件。这里的关键问题是,您使用的任何控件都无法获得焦点。因此,尝试将消息从子级传递给父级也不是一个解决方案。创建自己的网格控件从来都不是一个错误。考虑一个ListVIEW。或者使用可以获得焦点的面板:lblRecordNumber和lblRecordName是基于标签的控件。他们没有“IsEnabled”属性。至少VS2019在intellisense中没有显示我:(而且,覆盖WNDROC事件的解决方案无效。它不做任何操作:(@ValiMaties My错误,从内存写入,它被称为“Enabled”。
this.SetStyle(ControlStyles.Selectable, true);
this.TabStop = true;