Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将子控件的单击事件传递给父控件_C#_.net_Winforms_User Controls_Controls - Fatal编程技术网

C# 将子控件的单击事件传递给父控件

C# 将子控件的单击事件传递给父控件,c#,.net,winforms,user-controls,controls,C#,.net,Winforms,User Controls,Controls,我有一个Windows窗体,有一个窗格,其中包含从Windows窗体派生的另一个类。这是作为窗格中的控件包含的。它本身包含两个按钮 我希望子控件的事件一直传递到父窗口。例如,窗格中的子窗口有一个Cancel按钮,用于关闭它。我希望父控件(即主窗口)也关闭,但如何截获子控件的按钮单击事件 我可以修改子控件,但只有在没有其他方法以适当方式实现这一点的情况下,我才希望避免它。虽然您可以直接从子控件与父窗体交互,但最好通过子控件引发一些事件并订阅父窗体中的事件 从子级引发事件: public event

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

我希望子控件的事件一直传递到父窗口。例如,窗格中的子窗口有一个
Cancel
按钮,用于关闭它。我希望父控件(即主窗口)也关闭,但如何截获子控件的按钮单击事件


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

虽然您可以直接从子控件与父窗体交互,但最好通过子控件引发一些事件并订阅父窗体中的事件

从子级引发事件:

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);
}
//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();
}
注意:要引发XXXX事件,足以调用XXXX事件委托;创建
受保护的虚拟OnXXXX
的原因只是为了遵循该模式,让派生程序覆盖该方法,并在引发事件之前/之后自定义行为

订阅并使用父级中的事件:

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);
}
//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\u CloseButtonClicked”命令?我最初是在InitializeComponent命令之后放入的,但它不会捕获那里的事件。@tCoe将它放在InitializeComponent之后是正确的,应该可以工作。一开始可能根本不会引发该事件,因为您可能忘记将
CloseButton\u Click
分配给
CloseButton
Click
事件;private void btnOK_Click(object sender,EventArgs e){CloseButtonClicked?.Invoke(this,e);}@ClausMøllerJørgensen感谢您的反馈,是的,我们可以,特别是这部分
CloseButtonClicked?.Invoke(this,e)但是。。。单击
一次关闭按钮是有原因的。遵循.NET的标准事件模式,也让开发人员有机会重写虚拟的
OnCloseButtonClicked
方法。