将子控件的点击事件传递给父控件
Posted
技术标签:
【中文标题】将子控件的点击事件传递给父控件【英文标题】:Pass click event of child control to the parent control 【发布时间】:2021-06-13 10:31:10 【问题描述】:我有一个 Windows 窗体,有一个窗格,其中包含另一个从 Windows 窗体派生的类。这包含在窗格中作为控件。它本身包含两个按钮。
我希望将子控件的事件一直传递到父窗口。例如,窗格中的子窗口有一个Cancel
按钮,应该关闭它。我希望父控件,即主窗口也关闭,但是如何拦截子控件的按钮单击事件?
我可以修改子控件,但只有在没有其他方法以适当的方式实现这一点的情况下,我宁愿避免它。
【问题讨论】:
您为问题提供的描述与标题不同。你到底想要什么?单击子控件时是否要引发父窗体的单击事件?单击子控件中的按钮时是否要关闭父窗体?还是别的什么? 用户将点击子控件上存在的按钮-除了子控件上的一些事件外,甚至父控件也需要执行某些操作,但我不确定是不是最好的方法向父控件发出信号,并且在子控件上触发了某些事件。这些操作可以是一般操作,例如关闭所有表单,也可以是更复杂的操作。但是父级需要知道在属于子控件的控件上触发了一个事件。 虽然您可以直接从子窗体与父窗体交互,但最好通过子控件引发一些事件并订阅父窗体中的事件。 【参考方案1】:虽然您可以直接从子窗体与父窗体交互,但最好通过子控件引发一些事件并订阅父窗体中的事件。
从孩子引发事件:
public event EventHandler CloseButtonClicked;
protected virtual void OnCloseButtonClicked(EventArgs e)
CloseButtonClicked.Invoke(this, e);
private void CloseButton_Click(object sender, EventArgs e)
//While you can call `this.ParentForm.Close()` but it's better to raise the event
//Then handle the event in the form and call this.Close()
OnCloseButtonClicked(e);
注意:要引发 XXXX 事件,调用 XXXX 事件委托就足够了;创建protected virtual OnXXXX
的原因只是为了遵循模式让派生者覆盖方法并自定义引发事件之前/之后的行为。
在家长中订阅和使用事件:
//Subscribe for event using designer or in constructor or form load
this.userControl11.CloseButtonClicked += userControl11_CloseButtonClicked;
//Close the form when you received the notification
private void userControl11_CloseButtonClicked(object sender, EventArgs e)
this.Close();
要了解有关活动的更多信息,请查看:
Handling and raising events Standard .NET event pattern【讨论】:
谢谢你。我将检查是否可以修改子控件。 您能否描述一下我将放置“this.userControl11.CloseButtonClicked += userControl11_CloseButtonClicked”命令的位置?我最初在初始化组件命令之后将其放入,但它不会在那里捕获事件。 @tCoe 在 InitializeComponent 之后放置它是正确的,它应该可以工作。可能一开始根本没有引发该事件,因为您可能忘记将CloseButton_Click
分配给CloseButton
的Click
事件。
对于更简单的代码方法,您可以在子类中执行以下操作:public event EventHandler CloseButtonClicked; private void btnOK_Click( object sender, EventArgs e ) CloseButtonClicked?.Invoke( this, e );
@ClausMøllerJørgensen 感谢您的反馈,是的,我们可以,特别是对于这部分CloseButtonClicked?.Invoke( this, e );
但是......有OnCloseButtonClicked
是有原因的。遵循 .NET 的标准事件模式,并为开发人员提供了覆盖虚拟 OnCloseButtonClicked
方法的机会。以上是关于将子控件的点击事件传递给父控件的主要内容,如果未能解决你的问题,请参考以下文章