父控件上子控件的事件预览

时间:2014-01-27 13:26:23

标签: c# winforms events

有没有办法在父控件上触发子控件事件?

示例:名为ControlA的自定义用户控件,包含其他控件,如PictureBox和Label。 ControlA添加到窗体并设置MouseClick事件。如果用户单击控件的空白区域,则会触发该事件,但如果用户单击子控件(如PictureBox和Label),则不会执行任何操作。这是因为子控件在后台并且将处理事件。

The solution that I found即添加:

    public new event MouseEventHandler MouseClick
    {
        add
        {
            base.MouseClick += value;
            foreach (Control control in Controls)
            {
                control.MouseClick += value;
            }
        }
        remove
        {
            base.MouseClick -= value;
            foreach (Control control in Controls)
            {
                control.MouseClick -= value;
            }
        }
    }

但我需要对我想要使用的所有事件执行此操作,是否有其他方法可以解决此问题,例如在子控件上设置一些属性,因此我不需要“覆盖”很多事件

2 个答案:

答案 0 :(得分:1)

我有类似的情况。我使用了这个解决方案,但修改它来处理我拥有的对象。不同之处在于我有几种不同类型的用户组件,它们由混合的用户组件和常规组件组成,但我需要父组件来处理DragDrop的相关事件,这是因为父组件可以访问所需的所有信息。我修改了这个解决方案是递归的,(我不确定它是最好的解决方案,但是......)这为我省去了工作的基调。我可以将其复制并粘贴到其他组件上,并根据具体情况修改事件处理程序。它是这样的:

    private void HookChildrenEvents(Control control)
    {
        foreach (Control child in control.Controls)
        {
            if (child.Controls.Count > 0)
            {
                HookChildrenEvents(child);
            }
            child.DragEnter += child_DragEnter;
            child.MouseHover += child_MouseHover;
            child.MouseDown += child_MouseDown;
            child.DragDrop += child_DragDrop;
            child.AllowDrop = true;
        }
    }

答案 1 :(得分:0)

创建一种方法,为所有孩子连接所需的事件。如果需要,可以创建一个反方法:UnhookChildEvents。

public void HookChildEvents()
{
    foreach (Control child in this.Controls)
    {
        child.MouseClick += ChildOnMouseClick;
        child.DragEnter += ChildOnDragEnter;
        // ... add one for each event you care for.
    }
}