2009-12-23 50 views
0

有一个私人无效btnContBalloon_Click(对象发件人,EventArgs e)。我可以使这个静态,因为我想从静态方法调用,但我不能。使btn_Click事件静态

回答

4

让事件静止是拍摄脚部的好方法。静态事件具有无限的生命周期。这使得您为事件注册的任何事件处理程序都可以永远活着。这使得包含这样一个事件处理程序的任何表单都可以永远存在。泄漏。

注册一个静态事件的事件处理程序需要代码,例如,显式取消注册该处理程序的FormClosing事件处理程序。您可以在MSDN Library文章中明确记录SystemEvents类,这是.NET框架中具有静态事件的一个类的少数几个示例之一。

更好的方法是跟踪其按钮的Click事件应该被激活的表单实例。事情是这样的:

public partial class Form1 : Form { 
    public static Form1 MainForm { get; private set; } 
    public Form1() { 
     InitializeComponent(); 
     MainForm = this; 
    } 
    public void RunClickMethod() { 
     button1.PerformClick(); 
    } 
    protected override void OnFormClosing(FormClosingEventArgs e) { 
     MainForm = null; 
     base.OnFormClosing(e); 
    } 
    } 

这允许客户端代码执行此操作:

Form1.MainForm.RunClickMethod(); 
1

是的,如果该方法不需要封闭类的实例成员,那么可以使其成为静态。如果这是真正的问题,则什么都不能阻止事件处理程序变为静态。

底线:如果该方法仅使用发送对象(可能的按钮)和事件参数或其他静态成员,那么这是非常有效的和可能的。

+0

但你不应该从上下文从事件处理不同的调用的事件处理程序,为什么不给里面调用刚才的逻辑? – Restuta

+0

同意。我也会对这个用例感兴趣。虽然我猜想可以通过将相关代码抽取到静态方法中并从事件处理函数和第二个(静态)上下文中调用相关代码来改进设计。 –

+0

@restuta调用逻辑内部不起作用,所以它是必要的 – Harikrishna

0

一般情况:是的,可以将事件处理程序设为静态。但是静态方法的正常规则适用。

但是,当您将自动生成的事件处理程序更改为静态时,自动生成的代码通常会遇到麻烦。我只会用手动添加事件处理程序来完成此操作。