有没有办法在父控件上触发子控件事件?
示例:名为ControlA的自定义用户控件,包含其他控件,如PictureBox和Label。 ControlA添加到窗体并设置MouseClick事件。如果用户单击控件的空白区域,则会触发该事件,但如果用户单击子控件(如PictureBox和Label),则不会执行任何操作。这是因为子控件在后台并且将处理事件。
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;
}
}
}
但我需要对我想要使用的所有事件执行此操作,是否有其他方法可以解决此问题,例如在子控件上设置一些属性,因此我不需要“覆盖”很多事件
答案 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.
}
}