通常在代码中我会看到一行代码,我知道它会对事件做些什么但不清楚它是做什么的。
我是否有可能在表格B中附上表格A的加载事件,或者它的好处是什么?
this.CGForm .Load +=new EventHandler(CGForm_Load);
答案 0 :(得分:3)
此行的含义是您将方法CGForm_Load()
订阅到this.CGForm.Load
事件。方法CGForm_Load()
是事件处理程序或回调。
运行此行后,每次引发事件时(在这种情况下 - 每次加载表单时),都会自动调用CGForm_Load()
。
要取消订阅回调,请使用-=
,如下所示:
this.CGForm.Load -= new EventHandler(CGForm_Load)
一旦事件回调被取消订阅,下次引发事件时(如果再次加载表单),将不再调用回调。
我发现以下比喻很有用:事件就像电源插座,回调就像电源插头。订阅就像将插头连接到插座,取消订阅就像拉出来一样。当存在连接时,事件的所有调用都会触发回调。
答案 1 :(得分:3)
是的,这显然与事件有关。
在这种情况下,{p>.Load
是Form.Load
事件。 +=
运算符向事件添加一个事件处理程序。事件可以同时具有许多事件处理程序。事件处理程序只是常规方法,可以在代码库中的任何位置。当事件触发时,将一个接一个地调用所有订阅的方法。
我认为没有特别好的理由让FormA听取FormB的Load
事件,但其他事件可能更有趣,比如Form.Closed
事件。这是让FormA对FormB中的更改做出反应的一种方法。
修改强>
请注意,这会导致FormA保留对FormB的引用,并且FormA将不会被垃圾收集,直到FormA释放对FormB的引用(具有
)
this.CGForm .Load -=new EventHandler(CGForm_Load);
,请注意-=
)这是.NET中内存泄漏的常见原因。
订阅其他表单中的事件是一种“代码味道”,可能是您的代码存在潜在的结构问题。在某些情况下,它是必需的,但是如果你在整个地方都有它,你的代码将难以理解和维护。
答案 2 :(得分:3)
它只是将GCForm_Load方法添加到CGForm上的Load事件中。在加载CGForm时,如下所示的代码将执行。每当发生这种情况时,将调用所有事件订阅者(在这种情况下,此处订阅的方法为CGForm_Load)。
<pseudocode>
class CGForm
{
public EventHandler<FormLoadedEventArgs> Load;
private void SomeMethodThatLoadsTheForm()
{
LoadForm();
var loadHandlers = Load;
if (loadHandlers != null)
{
loadHandlers(new FormLoadedEventArgs(...));
}
}
}
</pseudocode>
答案 3 :(得分:2)
this.CGForm .Load +=new EventHandler(CGForm_Load);
将事件处理程序委托CGForm_Load
订阅到Load
对象的CGForm
事件。
有关订阅活动的文档可在http://msdn.microsoft.com/en-us/library/ms366768(v=vs.80).aspx找到。
有关事件如何在.NET中工作的信息索引可以在http://msdn.microsoft.com/en-US/library/awbftdfh(v=VS.80).aspx
找到