C# 使btn_Click事件处于静态状态

C# 使btn_Click事件处于静态状态,c#,.net,winforms,C#,.net,Winforms,有一个私有的void btnContballon\u Clickobject sender,EventArgs e。我可以将此设置为静态,因为我想从静态方法调用它,但我不能。是的,如果该方法不需要封闭类的实例成员,则可以将其设置为静态。如果这是真正的问题,那么没有什么可以阻止事件处理程序是静态的 底线:如果该方法仅使用发送者对象(可能是按钮和事件参数或其他静态成员),那么这是完全有效和可能的。是的,如果该方法不需要封闭类的实例成员,则可以将其设为静态。如果这是真正的问题,那么没有什么可以阻止事件

有一个私有的void btnContballon\u Clickobject sender,EventArgs e。我可以将此设置为静态,因为我想从静态方法调用它,但我不能。

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


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

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


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

一般来说:是的,可以将EventHandler设置为静态。但是静态方法的常规规则适用


但是,当您将自动生成的eventhandler更改为静态时,自动生成的代码通常会遇到问题。我只会使用手动添加的EventHandler来实现这一点。

一般来说:是的,EventHandler可以设置为静态。但是静态方法的常规规则适用


但是,当您将自动生成的eventhandler更改为静态时,自动生成的代码通常会遇到问题。我只会使用手动添加的事件处理程序来实现这一点。

将事件设置为静态是一种很好的解决方法。静态事件具有无限的生存期。这使得您为该事件注册的任何事件处理程序也永远有效。这使得任何包含此类事件处理程序的表单也永远存在。漏洞

为静态事件注册事件处理程序需要在FormClosing事件处理程序中编写代码,以显式取消注册该处理程序。您可以在MSDN Library文章中看到SystemEvents类的详细说明,SystemEvents类是.NET framework中少数几个具有静态事件的类的示例之一

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

  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();

使事件静止是一个很好的射击方式。静态事件具有无限的生存期。这使得您为该事件注册的任何事件处理程序也永远有效。这使得任何包含此类事件处理程序的表单也永远存在。漏洞

为静态事件注册事件处理程序需要在FormClosing事件处理程序中编写代码,以显式取消注册该处理程序。您可以在MSDN Library文章中看到SystemEvents类的详细说明,SystemEvents类是.NET framework中少数几个具有静态事件的类的示例之一

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

  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();

但您不应该从不同于事件处理的上下文调用事件处理程序,为什么不调用内部逻辑呢?同意。我也会对用例感兴趣。虽然这是可能的,但我想通过将相关代码提取到一个静态方法中,并从事件处理程序和第二个静态上下文中调用该方法,可以改进设计。@restuta调用内部逻辑不起作用,因此它是必需的。这是怎么回事?我不相信你=请向我们展示你的代码。你可以编写你自己的事件处理程序,为什么要更改这个。但你不应该从不同于事件处理的上下文调用事件处理程序,为什么不调用内部逻辑?同意。我也会对用例感兴趣。虽然这是可能的,但我想通过将相关代码提取到一个静态方法中,并从事件处理程序和第二个静态上下文中调用该方法,可以改进设计。@restuta调用内部逻辑不起作用,因此它是必需的。这是怎么回事?我不相信你=请向我们展示你的代码。你可以编写自己的事件处理程序来解释为什么要更改这个。