Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 触发事件后类变量的可用性_C#_Winforms_Events_Event Handling_Scope - Fatal编程技术网

C# 触发事件后类变量的可用性

C# 触发事件后类变量的可用性,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) {

我对事件编程还不熟悉,我显然误解了我要做的事情

我有一个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
为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;
    

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

    请提供一个简短但完整的程序来演示这个问题。这当然可以。我怀疑这与您如何连接事件有关。我猜问题在于您在何处创建类的实例以及如何触发事件。问题不在于这段代码。谢谢,我刚刚意识到这就是我正在做的。我只是被我没有正确理解事件驱动代码的想法所困扰。谢谢你的输入。如果,我感谢你的回答。