2012-06-28 3 views
0

Я новичок в программировании событий, и я, очевидно, неправильно понимаю то, что я пытаюсь сделать.Доступность переменной класса после события

У меня есть приложение Windows Forms, которое подписывается на события из другого класса. 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, чтобы включить переменные данные, но я пытаюсь понять, почему то, что я делаю, не работает.

+3

Просьба представить короткую, но полную программу, демонстрирующую проблему. Это обязательно * должно быть хорошо. Я подозреваю, что это связано с тем, как вы подключаете мероприятие. –

+0

Я думаю, проблема заключается в том, где вы создаете экземпляр класса и как запускается событие. проблема не в этом коде конечно –

ответ

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; 

... но трудно сказать, не видя больше кода.

+0

Спасибо, я только что понял, что это то, что я делаю. Я просто догнал идею о том, что я неправильно понял код, управляемый событиями. – Span

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; 
    } 
} 
+0

Спасибо за вход Asif, я ценю ваш ответ. – Span

Смежные вопросы