0

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

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

//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 窗体代码中,我首先Value在类中设置变量,Foo然后触发将执行上述代码的事件OnEventFired

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

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

4

2 回答 2

6

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

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;

...但是如果不看到更多代码就很难说。

于 2012-06-28T06:25:44.120 回答
2

您无法访问该变量的唯一原因Value

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

最好的办法是获取Valuein 构造函数,这样就可以保证Value设置了。

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

    public Foo(Value value)
    {

    }

    public void HandleClick(object sender, EventArgs e)
    {
        ((Control)sender).Text = Value;
    }
} 
于 2012-06-28T06:25:31.560 回答