【问题标题】:Class variable availablility after event is fired触发事件后的类变量可用性
【发布时间】:2012-06-28 06:20:16
【问题描述】:

我是事件编程的新手,我显然误解了我正在尝试做的事情。

我有一个订阅另一个类的事件的 Windows 窗体应用程序。 T

//Class that provides event handler to Windows Forms application.
class Foo
{
  public string Value{get; set;}

  // Lots of other code

  public void OnEventFired(object sender, EventArgs e)
  {
     // Attempt to access variable Value here.
  }    
}

从 Windows 窗体代码中,我首先在类 Foo 中设置变量 Value,然后触发将执行上述 OnEventFired 中代码的事件。

我看到的是,当在事件处理程序中使用变量 Value 时,它不包含在事件触发之前设置的值(Value 为空)。

我知道我可以扩展 EventArgs 以包含可变数据,但我试图理解为什么我正在做的事情不起作用。

【问题讨论】:

  • 请提供一个简短但完整的程序来演示该问题。这当然应该没问题。我怀疑这与你如何安排活动有关。
  • 我想问题是你在哪里创建类的实例以及如何触发事件。问题当然不在于这段代码

标签: c# winforms events event-handling scope


【解决方案1】:

这是一个有效的简短示例。将此与您的代码进行比较以找出问题所在。

using System;
using System.Windows.Forms;

class Foo
{
    public string Value { get; set; }

    public void HandleClick(object sender, EventArgs e)
    {
        ((Control)sender).Text = Value;
    }
}

class Program
{
    public static void Main()
    {
        Foo foo = new Foo { Value = "Done" };

        Button button = new Button { Text = "Click me!" };
        button.Click += foo.HandleClick;

        Form form = new Form
        {
            Controls = { button }
        };

        Application.Run(form);
    }
}

我的猜测是您使用的Foo 实例与您设置Value 的实例不同。例如,像这样:

Foo foo = new Foo { Value = "Done" };           
...
// Different instance of Foo!
button.Click += new Foo().HandleClick;

...但是如果不看更多代码就很难判断。

【讨论】:

  • 谢谢,我刚刚意识到这就是我正在做的事情。我刚刚陷入了我没有正确理解事件驱动代码的想法。
【解决方案2】:

你不能访问变量Value的唯一原因是

  1. Value 未设置
  2. 您将event 绑定到另一个实例,而不是设置了Value 的实例。

最好是在构造函数中获取Value,这样可以保证Value被设置。

class Foo
{
    public string Value { get; set; }

    public Foo(Value value)
    {

    }

    public void HandleClick(object sender, EventArgs e)
    {
        ((Control)sender).Text = Value;
    }
} 

【讨论】:

  • 感谢 Asif 的输入,感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2012-06-30
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多