C# 触发事件后类变量的可用性
我对事件编程还不熟悉,我显然误解了我要做的事情 我有一个Windows窗体应用程序,它订阅另一个类的事件。TC# 触发事件后类变量的可用性,c#,winforms,events,event-handling,scope,C#,Winforms,Events,Event Handling,Scope,我对事件编程还不熟悉,我显然误解了我要做的事情 我有一个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) {
//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
为null)
我知道我可以扩展
EventArgs
以包含变量数据,但我试图理解为什么我所做的不起作用。无法访问变量值的唯一原因是
值
未设置
您正在将事件
绑定到不同的实例,而不是设置了值的实例
最好是在构造函数中获取值
,这样就可以保证值
已设置
class Foo
{
public string Value { get; set; }
public Foo(Value value)
{
}
public void HandleClick(object sender, EventArgs e)
{
((Control)sender).Text = Value;
}
}
这里有一个简单的例子,它是有效的。将此代码与您的代码进行比较,找出问题所在
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);
}
}
我的猜测是,您使用了与您在中设置的Value
不同的Foo
实例来连接事件处理程序。例如,像这样:
Foo foo = new Foo { Value = "Done" };
...
// Different instance of Foo!
button.Click += new Foo().HandleClick;
。。。但是如果看不到更多的代码就很难判断。请提供一个简短但完整的程序来演示这个问题。这当然可以。我怀疑这与您如何连接事件有关。我猜问题在于您在何处创建类的实例以及如何触发事件。问题不在于这段代码。谢谢,我刚刚意识到这就是我正在做的。我只是被我没有正确理解事件驱动代码的想法所困扰。谢谢你的输入。如果,我感谢你的回答。