【问题标题】:Pass click event of child control to the parent control将子控件的点击事件传递给父控件
【发布时间】:2021-06-13 10:31:10
【问题描述】:

我有一个 Windows 窗体,有一个窗格,其中包含另一个从 Windows 窗体派生的类。这包含在窗格中作为控件。它本身包含两个按钮。

我希望将子控件的事件一直传递到父窗口。例如,窗格中的子窗口有一个Cancel 按钮,应该关闭它。我希望父控件,即主窗口也关闭,但是如何拦截子控件的按钮单击事件?

我可以修改子控件,但只有在没有其他方法以适当的方式实现这一点的情况下,我宁愿避免它。

【问题讨论】:

  • 您为问题提供的描述与标题不同。你到底想要什么?单击子控件时是否要引发父窗体的单击事件?单击子控件中的按钮时是否要关闭父窗体?还是别的什么?
  • 用户将点击子控件上存在的按钮-除了子控件上的一些事件外,甚至父控件也需要执行某些操作,但我不确定是不是最好的方法向父控件发出信号,并且在子控件上触发了某些事件。这些操作可以是一般操作,例如关闭所有表单,也可以是更复杂的操作。但是父级需要知道在属于子控件的控件上触发了一个事件。
  • 虽然您可以直接从子窗体与父窗体交互,但最好通过子控件引发一些事件并订阅父窗体中的事件。

标签: c# .net winforms user-controls controls


【解决方案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();
}

要了解有关活动的更多信息,请查看:

【讨论】:

  • 谢谢你。我将检查是否可以修改子控件。
  • 您能否描述一下我将放置“this.userControl11.CloseButtonClicked += userControl11_CloseButtonClicked”命令的位置?我最初在初始化组件命令之后将其放入,但它不会在那里捕获事件。
  • @tCoe 在 InitializeComponent 之后放置它是正确的,它应该可以工作。可能一开始根本没有引发该事件,因为您可能忘记将CloseButton_Click 分配给CloseButtonClick 事件。
  • 对于更简单的代码方法,您可以在子类中执行以下操作: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 方法的机会。
猜你喜欢
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多