重定向事件按钮委托事件 [英] Redirect event button delegate event
本文介绍了重定向事件按钮委托事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在WinForm上有一个单独的控制器UserControl 1Panel + 2Button
我尝试了什么:
命名空间TestToolBar1
{
public partial class UserControl1:UserControl
{
private System.ComponentModel.Container components = null;
public UserControl1()
{
InitializeComponent();
}
//定义一个事件处理程序委托,它基本上重用现有的
//签名
public delegate void EventHandler(object sender,System.EventArgs e );
// decalre事件处理程序委托
EventHandler EventHandlerDelegate;
//重新定义Click事件
新公共事件EventHandler单击
{
//这相当于Click + = new EventHandler(...)
添加
{
this.EventHandlerDelegate + = value;
}
//这相当于Click - = new EventHandler(...)
remove
{
this.EventHandlerDelegate - = value;
}
}
//转发按钮的点击事件
private void button_Click(object sender,System.EventArgs e)
{
if(this.EventHandlerDelegate!= null)
this.EventHandlerDelegate(sender,e);
}
}
}
和表格上的声明
命名空间TestToolBar1
{
public partial class Form2:Form
{
private TestToolBar1.UserControl1 userControl11;
private System.ComponentModel.Container components = null;
public Form2()
{
InitializeComponent();
UserControl1 myctrl = new UserControl1();
myctrl.Top = 0;
myctrl.Left = 0;
myctrl.Parent = panel1;
myctrl.Show();
}
....
private void userControl_Click1(object sender,System.EventArgs e)
{
Control ctrl = sender as Control;
MessageBox.Show(message);
}
问题EventHandlerDelegate总是空的而不是重定向
private void button_Click(object sender,System.EventArgs e)
{
if(this.EventHandlerDelegate!= null)
this.EventHandlerDelegate(sender,e) ;
}
解决方案
它是null,因为你没有在任何时候为它添加一个处理程序:你提供代码,你创建控件实例,但你不添加处理程序。
如果没有添加处理程序,处理程序中没有任何动作收藏!
我是这样做的:
UserControl1:
///< summary>
///表示事情发生的事件
///< / summary>
公共事件EventHandler SomethingHappened;
///< summary>
///被叫来向订阅者发出SomethingHappened
///< / summary>
///< param name =e>< / param>
protected virtual void OnSomethingHappened(EventArgs e)
{
EventHandler eh = SomethingHappened;
if(eh!= null)
{
eh(this,e);
}
}
//转发按钮的点击事件
private void button1_Click(object sender,System.EventArgs e)
{
EventHandler eh = SomethingHappened;
if(eh!= null)
{
eh(this,e);
}
}
表格:
UserControl1 myctrl = new UserControl1 ();
myctrl.Top = 0;
myctrl.Left = 0;
myctrl.Parent = panel1;
myctrl.SomethingHappened + = myctrl_SomethingHappened;
myctrl.Show();
void myctrl_SomethingHappened(object sender,EventArgs e)
{
Console.WriteLine(It happen!);
}
如果您看一下:添加事件的简单代码片段 [ ^ ]它会自动添加事件的过程(只需键入evh并按Tab键,它就会填充空白)
I Have a separate contro UserControl 1Panel + 2Button on WinForm
What I have tried:
namespace TestToolBar1 { public partial class UserControl1 : UserControl { private System.ComponentModel.Container components = null; public UserControl1() { InitializeComponent(); } // define an event handler delegate which basically re-uses an existing // signature public delegate void EventHandler(object sender, System.EventArgs e); // decalre an event handler delegate EventHandler EventHandlerDelegate; // re-define the Click event new public event EventHandler Click { // this is the equivalent of Click += new EventHandler(...) add { this.EventHandlerDelegate += value; } // this is the equivalent of Click -= new EventHandler(...) remove { this.EventHandlerDelegate -= value; } } // forward the button's click event private void button_Click(object sender, System.EventArgs e) { if (this.EventHandlerDelegate != null) this.EventHandlerDelegate(sender, e); } } }
and the declaration on Form
namespace TestToolBar1 { public partial class Form2 : Form { private TestToolBar1.UserControl1 userControl11; private System.ComponentModel.Container components = null; public Form2() { InitializeComponent(); UserControl1 myctrl = new UserControl1(); myctrl.Top = 0; myctrl.Left = 0; myctrl.Parent = panel1; myctrl.Show(); } .... private void userControl_Click1(object sender, System.EventArgs e) { Control ctrl = sender as Control; MessageBox.Show("message"); }
problem EventHandlerDelegate is always Null and not redirect
private void button_Click(object sender, System.EventArgs e) { if (this.EventHandlerDelegate != null) this.EventHandlerDelegate(sender, e); }
解决方案
It's null because you haven't added a handler to it at any point: you provide the code, you create the control instance, but you don't add a handler.
And if no handler is added, there is nothing to action in the handler collection!
Here is how I'd do it:
UserControl1:
/// <summary> /// Event to indicate SomethingHappened /// </summary> public event EventHandler SomethingHappened; /// <summary> /// Called to signal to subscribers that SomethingHappened /// </summary> /// <param name="e"></param> protected virtual void OnSomethingHappened(EventArgs e) { EventHandler eh = SomethingHappened; if (eh != null) { eh(this, e); } } // forward the button's click event private void button1_Click(object sender, System.EventArgs e) { EventHandler eh = SomethingHappened; if (eh != null) { eh(this, e); } }
Form:
UserControl1 myctrl = new UserControl1(); myctrl.Top = 0; myctrl.Left = 0; myctrl.Parent = panel1; myctrl.SomethingHappened += myctrl_SomethingHappened; myctrl.Show();void myctrl_SomethingHappened(object sender, EventArgs e) { Console.WriteLine("It happened!"); }If you have a look here: A Simple Code Snippet to Add an Event[^] it automates the process of adding an event (just type "evh" and press tab, and it fills in the blanks)
这篇关于重定向事件按钮委托事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文