0

私はイベントプログラミングに不慣れで、自分がやろうとしていることを明らかに誤解しています。

別のクラスのイベントをサブスクライブする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フォームコードから最初Valueにクラスに変数を設定します。FooOnEventFired

私が見ているのは、イベントハンドラーで使用すると、イベントが発生する前に設定された値( null)が変数Valueに含まれていないことです。Value

変数データを含めるように拡張できることは知って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います。

Valueが設定されていることが保証されるように、 in コンストラクターを取得するのが最善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 に答える