2012-02-01 4 views
1

私はクラスMyClass,aおよびbのインスタンスを持っています。 MyClassにはフィールドTextがあります。 MyEvent(MyClass target)b.Selectedに割り当てたいとします。このイベントが発生すると、このイベントはa.Textに変更されます。 「それはaTextになるだろう、私の意図はaTextは 『フー』、になりますがb場合 "ということであるの選択されたイベント火災、イベントを別のオブジェクトに変更する

void MainMethod() 
{ 
    var a = new MyClass(); 
    a.Text = "Foo"; 

    var b = new MyClass(); 
    b.Selected += MyEvent(a); // Make the event fire when b is "selected" 
} 

void MyEvent(MyClass target) { 
    target.Text = "Bar"; 
} 

を明確にする:私はこのようになりますいくつかのコードを持っていますバー"。

私は上記と同様のものを実装しようとしましたが、うまくいかなかった。 (VS2010は、なぜ私がnullであるのかわからなくても、MyEvent(a)はnull引数のイベントであると主張しています)

私はイベントを非常によく理解していませんこれは明らかです。

DETAILS:実際には

、私はLabelSelectableないMyClassを使用しています。 LabelSelectableControlは、ピクチャ、ボタン、ラベルなどのさまざまなものを画面に表示するためのクラスです(関連する場合はXNAです)。基本的にこの場合は、これらの選択可能なラベルの束を矢印で循環させることができます。指定されたラベルにEnterキーを押すと、Selectedイベントが発生します。

私は実際にこのチュートリアルに従っていました。そこに実装の詳細があります。 (私は役に立たないことを意味するわけではありませんが、どの部分が関連しているのかわからないのか正確には分からないので、ここにすべてを置くと多くのコードになります)。

私のできる限り参照、「MyClassは」このようなものになります。

MyClass 
{ 
    public event EventHandler Selected; 

    public string Text 
    { 
     get { return text; } 
     set { text = value; } 
    } 

    void OnSelected(EventArgs e) 
    { 
     if (Selected != null) 
     { 
      Selected(this, e); 
     } 
    } 
} 

を私は道で、動作するように以下のコードと同等のものを得ることができます。

void MainMethod() 
{ 
    var a = new MyClass(); 
    a.Text = "Foo"; 

    var b = new MyClass(); 
    b.Selected += MyEvent; // Make the event fire when b is "selected" 
} 

void MyEvent(object sender, EventArgs e) { 
    Console.WriteLine("Event fired!"); 
} 

それはコンソールに出力のものでしょうbがあるとき選択されました。

+1

イベントのソースは、イベントハンドラにパラメータとして渡される標準イベンティングパターンに従うことadventageousかもしれ。 –

+0

Nitpick - あなたのコード内の 'MyEvent'は、イベントではなくイベントハンドラです。 – Oded

+0

MyClassはどのようなものから外れますか?それは視覚的なコンポーネントであり、祖先に実装された.Selectedプロパティです。イベントにはSenderとEventArgsの何らかの形式が必要です。 –

答えて

1

イベントハンドラ宣言にパラメータを配置しないでください。

b.Selected += MyEvent(a); // Make the event fire when b is "selected"

はちょうどどちらかのMyClassが選択されての呼び出しに目標の値を渡すための責任を負わなければならないか、どのオブジェクトを決定するために、MyEvent方法自体に依存しなければならない

b.Selected += MyEvent; // Make the event fire when b is "selected"

する必要があります変更する。特にイベントの `MyClass`、の定義を示してください

void MyEvent(object sender, EventArgs e) { 
    var source = sender as MyClass; 

    var target = /* do something here to find the target based on the sender */ 

    target.Text = "Bar"; 
} 
+0

「ここに何か」の部分を教えてください。 – Superbest

+0

MyClassオブジェクトのインスタンスがどのように実際に関連しているかわかりません。あなたのコードが表示されているとおりで、インスタンスaとbしか持たない場合は、ハンドラMyEvent(private MyClass _b;)を含むクラスのprivateメンバーを単純に作成し、MyEventメソッドでは単にターゲット。これらの関係の多くがある場合は、マッピングを定義するDictionary (以下の_dictionary)タイプのプライベートメンバーを作成し、ソース/ターゲットのペアを追加することができます。 MyEventでは、以下を行います:var target = _dictionary [source]。 – roken

+0

ラベルのTagプロパティを使用して、クリックしたときのテキストを更新するコントロールへの参照を保持することもできます。 MainMethod()で:a.Tag = b; MyEventでは:var target = source.Tag MyClass;再度、あなたが取るアプローチは、あなたが更新しているあなたの 'b'インスタンスと変更の刺激である 'a'インスタンスの関係に完全に依存しています。 – roken

関連する問題