我是c#的新手,如果这是一个noob问题,请道歉。我试图弄清楚在c#中处理事件的语法或模式。
所以我在表单中有一个Form
对象Form1
和一个Button button1
。我在Form1.cs中使用这样的方法处理Click事件:
private void button1_Click(object sender, EventArgs e)
{
Debug.WriteLine("click!");
}
工作正常。现在换另一种形式Form2
我有TreeView treeView1
,我想处理BeforeExpand
事件。所以我认为它会是:
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
Debug.WriteLine("Hello!");
}
实际上不起作用:扩展节点时从不调用此方法。但是几个SO答案暗示 是这样做的方式,例如one。
无论如何,我找到了另一种适合我的方法。在表单构造函数中绑定事件处理程序,如下所示:
treeView1.BeforeExpand += new TreeViewCancelEventHandler(anyMethodNameYouLike);
那么这两种方法有什么区别?为什么_event语法不适用于树视图?事件类型之间是否存在一些差异?
由于
答案 0 :(得分:5)
我假设您双击了Visual Studio设计器中的按钮。 button1_Click
处理程序已自动添加,就像您手动创建BeforeExpand
处理程序一样。
检查您的Form1.Designer.cs文件,您将找到如下所示的行:
this.button1.Click += new System.EventHandler(this.button1_Click);
答案 1 :(得分:5)
你需要两件事:
1)一种可以处理相关事件类型的方法。对于TreeViewCancelEventHandler
(MSDN)委托,正确的方法签名是:
public void MyMethodNameGoesHere(Object sender,TreeViewCancelEventArgs e)
{
// do some impressive stuff here
}
2)您必须注册参加活动:
treeView1.BeforeExpand += new TreeViewCancelEventHandler(MyMethodNameGoesHere);
您也可以只使用方法名称:
treeView1.BeforeExpand += MyMethodNameGoesHere;
作为最后一种选择,您可以将这种“内联”语法用于小函数:
treeView1.BeforeExpand += (sender, e) =>
{
// do a bit of magic here
};
有可能知道的是,处理程序注册不会“堆叠”(对不起的措辞感到抱歉,非常欢迎改进建议!)。 这意味着当您执行以下操作时,不会在最后一行执行后接收更多事件:
treeView1.BeforeExpand += MyMethodNameGoesHere;
treeView1.BeforeExpand += MyMethodNameGoesHere;
treeView1.BeforeExpand += MyMethodNameGoesHere;
treeView1.BeforeExpand -= MyMethodNameGoesHere; // note the MINUS sign
答案 2 :(得分:4)
你拥有的是正确的。您需要像在第二种情况下那样将处理程序添加到事件中。
必须有这样的一行:
button1.Click += button1_Click;
(可能带有new EventHandler()
包装器)在Form1
代码中的某个位置,很可能位于.designer.cs文件中。
答案 3 :(得分:1)
第一种语法,根本不是语法,只是事件处理程序的命名约定。您使用第二种语法所做的是设置一个事件处理程序的委托并将其添加到该事件。
如果选中Form1,然后单击选择按钮并查看其事件属性,则事件很可能通过设计器连接。您可以通过设计器在其表单上对TreeView执行相同的操作。
答案 4 :(得分:1)
C#事件处理系统不适用于任何类型的命名约定(我想您可能认为是这种情况?)。在treeview1的BeforeExpand事件中不会调用名为treeView1_BeforeExpand
的方法,除非您告诉它在该特定事件上调用该方法。
下面的代码说“当触发BeforeExpand事件时,调用anyMethodNameYouLike方法。
treeView1.BeforeExpand += new TreeViewCancelEventHandler(anyMethodNameYouLike);
您必须编写anyMethodNameYouLike方法。
答案 5 :(得分:1)
在WinForms中,您可以使用“属性”工具箱绑定设计器中的事件处理程序,然后单击顶部的闪电按钮。这将打开事件选项卡。只需双击事件名称即可在代码中生成处理程序,或从下拉列表中选择具有正确签名的现有方法。这实际上会在.designer文件中为您生成“+ =”代码。
自动生成名称Control_Event。但是,您可以为处理程序使用任何名称,甚至可以注册多个名称。
答案 6 :(得分:0)
这是订阅活动的正确方法。当您通过它订阅事件时,设计器会自动将该行添加到.designer.cs文件中。
无论哪种方式,这行代码都会写在某处。区别在于一个事件是通过设计师订阅的,而另一个是您手动订阅的。