C#用户控件按钮单击事件处理程序从主窗体调用函数

我有一个Form和一个UserControl。 在我的UserControl中,我有一个按钮,我想从Form中调用一个方法。 任何人都可以帮助C#?

您需要为usercontrol的button-event创建一个事件处理程序,并从实际按钮的click事件中触发它。

class MyControl : UserControl { public delegate void ButtonClickedEventHandler(object sender, EventArgs e); public event ButtonClickedEventHandler OnUserControlButtonClicked; } 

现在你需要听实际按钮的事件:

 class MyControl : UserControl { // See above public MyControl() { _myButton.Click += new EventHandler(OnButtonClicked); } private void OnButtonClicked(object sender, EventArgs e) { // Delegate the event to the caller if (OnUserControlButtonClicked != null) OnUserControlButtonClicked(this, e); } } 

从主表单(所有者),您现在可以收听该事件:

 public FancyForm : Form { public FancyForm() { _myUserControl.OnUserControlButtonClicked += new EventHandler(OnUCButtonClicked); } private void OnUCButtonClicked(object sender, EventArgs e) { // Handle event from here MessageBox.Show("Horray!"); } } 

更新 :通过使用Lambdas和默认的EventHandler委托定义,两种实现甚至可以保护几行代码。

 class MyControl : UserControl { public event EventHandler OnUserControlButtonClicked; // Use this, if you want to use a different EventArgs implementation: // public event EventHandler OnUserControlButtonClicked; public MyControl() { _myButton.Click += (s, e) => { if (OnUserControlButtonClicked != null) OnUserControlButtonClicked(this, e); } } } public FancyForm : Form { public FancyForm() { _myUserControl.OnUserControlButtonClicked += (s, e) => MessageBox.Show("Horray!"); } } 

更新2 :使用C#6的强大function确保更多线路安全:

 class MyControl : UserControl { public event EventHandler OnUserControlButtonClicked; public MyControl() { _myButton.Click += (s, e) => this.OnUserControlButtonClicked?.Invoke(this, e); } } 

作为解决这个问题的另一种方法,我实现它略有不同,因为我的方法似乎比以前建议的更直观,更直接,更容易理解(至少对我个人而言)。

考虑myButton是私有的。 因此,无法从UserControl实例外部覆盖/调用按钮的单击事件。 在UserControl中创建一个公共方法,将EventHandler添加到按钮的click事件中:

 class MyControl : UserControl { public void addOnButtonClickHandler(EventHander handler) { this.myButton.Click += handler; } } 

然后在Form类中创建一个私有处理程序方法,在事件被触发时执行(例如单击按钮)并调用UserControl对象的公共方法addButtonOnClickHandler,将Form的处理程序方法注册到UserControl的button.Click事件:

 public MyForm : Form { public MyForm() { // The call is placed here for simplicity but should not reside in the constructor this.myUserControl.addOnButtonClickHandler(new EventHandler(OnUCButtonClickHandler)); } private void OnUCButtonClickHandler(object sender, EventArgs e) { // Handle event here MessageBox.Show("Event handled in the Form class"); } } 

不需要创建事件并委托自己,因为它们已经由Button.Click提供。

在usercontrol中创建一个eventhandler,并从表单链接方法到eventhandler ..在按钮上单击执行eventhandler

取决于主窗体类的调用方式:(fe MainForm)

 MainForm parent = this.ParentForm as MainForm parent.YourPublicFuntion() 

在用户控件中按钮的onclick事件处理程序中