我们可以在表单上创建的按钮是根据Form1.Designer.cs中的事件处理程序编写的
this.button1.Click += new System.EventHandler(this.button1_Click);
此处Click
是public event EventHandler
的类型,此EventHandler
是委托
public delegate void EventHandler(object sender, EventArgs e);
现在,
为什么不能'='(等于)
this.button1.Click = new System.EventHandler(this.button1_Click);
并且当我传递参数this.button1_Click
时,它是如何匹配的
void EventHandler(object sender, EventArgs e);
代表?在这里,我有两个论点。
请用此清除我。
谢谢
答案 0 :(得分:1)
实际上,您正在为事件添加处理程序,而不是设置一个处理程序。您可能希望为事件提供更多处理程序。一个处理程序不应该排除其他处理程序,因为可能有多个操作可能要响应单个事件而发生,这些事件可能发生在不同的类,不同的地方,不同的线程和不同的条件下。 + =表示让我成为此活动的订阅者(可能还有一个订阅者)。
答案 1 :(得分:1)
如果您想要在Click事件上调用多个方法,该怎么办?你正在做什么
this.button1.Click += new System.EventHandler(this.button1_Click);
正在注册this.button1_Click方法,以便在引发Click事件时调用。 +=
添加了处理程序而NOT分配处理程序。
答案 2 :(得分:1)
那么,让我们看看是什么事件。
代码,你写的是
public event EventHandler MyEvent;
将编译为
private EventHandler MyEvent = null;
[MethodImp(MethodImplOptions.Synchronized)]
public void add_MyEvent(EventHandler value) {
MyEvent = (EventHandler)Delegate.Combine(MyEvent, value);
}
[MethodImp(MethodImplOptions.Synchronized)]
public void remove_MyEvent(EventHandler<NewMailEventArgs> value) {
MyEvent = (EventHandler)Delegate.Remove(MyEvent, value);
}
因此,如您所见,您无法直接访问委托,只能调用+ =和 - =,这会被重写为事件类。 您也可以通过重写方法+ =和 - =来手动管理此机制。 你可以这样做:
public event EventHandler MyEvent
{
add { //your code for += here }
remove { //your code for -= here }
}
有关您可以在“CLR via C#”一书中阅读的活动和代表的更多信息。我在本书中找到了所有这些。
答案 3 :(得分:0)
1 /它不能是'='(等于)因为委托就像一个函数指针 2 /如果要将参数传递给事件按钮单击,则必须创建自己的按钮类并实现Click事件并拥有自己的EventArgs
示例代码:
public class MyEventArg
{
int _param1;
string _param2;
//you can add more param
public MyEventArg(int _param1,string _param2)
{
this._param1 = _param1;
this._param2 = _param2;
}
}
public delegate void MyButtonClickHandler(object sender, MyEventArg e)
public class MyButton:Control
{
public event MyButtonClickHandler OnMyClick;
//You can raise your event here
protected override void OnClick(EventArgs e)
{
MyEventArg e = new MyEventArg(1,"a");//just sample data here
this.OnMyClick(this,e);
}
}
包含MyButton类的表单即时
public partial class Form1 : Form
{
MyButton myButton = new MyButton();
public Form1()
{
InitializeComponent();
myButton.OnMyClick += new MyButtonClickHandler(this.myButton_OnMyClicked);
}
private void myButton_OnMyClicked(object sender, MyEventArg e){
//your implementation
}
}
答案 4 :(得分:0)
亲爱的Nagaraj Tantri,
对于问题1:如上所述,由于代表可以设置多事件。
对于问题2:正如culithay所说,如果你想通过事件禁止传递自定义参数
点击,如果您想使用 EventHandler 并传递cutom自己的参数
您必须自定义控件类和自定义事件参数
自定义事件参数 CustomEventArg 应该继承 EventArg 类。
您可以采用以下示例代码。
// Customs ColorChanged's event parameter.
public class ColorChangedEventArgs : EventArgs
{
private Color color;
public ColorChangedEventArgs(Color c)
{
color = c;
}
public Color GetColor
{
get { return color; }
}
}
//Add this method in your custom control
protected void ibtnTest_Click(object sender, ColorChangedEventArgs e)
{
//TODO;
}
您还可以参考MSDN here