2017-12-15 20 views
0

私はPanel[,]の中にいくつかのパネルがあるウィンドウフォームを持っています。ユーザーがパネルのいずれかをクリックするたびに、クリックされたパネルを処理するための固有のイベントが必要です。私はswitch文を持つ単一のイベントを持つことを考えましたが、それは比較的同じ習慣であると考えていましたし、扱いが面倒かもしれません。あなたがイベントを行うには良い方法をご存知の場合複数のイベントリスナーに反映されたメソッドを呼び出すC#

Type t = typeof(Program); 
var methods = t.GetMethods(BindingFlags.Public | BindingFlags.Static).Where(m => m.Name.EndsWith("_click")).ToArray(); 
char[] cArr = { 'a', 'b', 'c', 'd' }; 

for(int i = 0; i < 4; i++) 
{ 
    for(int j = 0; j < 4; j++) 
    { 
     MethodInfo method = methods.Single(
      m => m.Name == cArr[i].ToString() + (j + 1) + "_click"); 
     // method.Invoke(null, null); 
     // myPanels[i, j].Click += new EventHandler(); 
    } 
} 

private void a1_click(object sender, System.EventArgs e) 
{ 
    MessageBox.Show("Unique event A1"); 
} 
private void a2_click(object sender, System.EventArgs e) 
{ 
    MessageBox.Show("Unique event A2"); 
} 
//... 
private void d4_click(object sender, System.EventArgs e) 
{ 
    MessageBox.Show("Unique event D4"); 
} 

:たぶん私が何をしようとしている

はこれに似ています。..すべて間違ってイベントハンドラのデザインについてつもりです私はそれを理解したいと思うので、デザインアプローチから私に知らせてください。しかし、この例のように、私はEventHandler内にメソッドを置くことになっています。私はそれらを手動で割り当てられている場合、私はちょうどこのような何か行うことができます:

myPanels[0, 0].Click += new EventHandler(a1_click); 

をしかし、割り当て部を介して、私は思いますむしろ、ループ、またはイベントそのものを再考します。

何か助けていただければ幸いです。

+0

それはその非常に考えにくいですこれらのパネルのイベントハンドラはすべて完全に無関係であり、互いに何の関係もありません。実際に* *の場合、イベントハンドラを動的に配線することは意味がありません。イベントの実際の処理がまったく関係がないのに対し、イベントハンドラの配線はすべてのアイテムで共通するのはなぜですか? – Servy

+0

あなたは何をしますか:すべてのパネルで共通の動作を持つユニークなイベントハンドラを作成しますか?イベントが無関係であれば、各パネルには独自のイベントがあるはずです – mnieto

+0

@mnieto質問には、具体的には*そうしたくないと言われています。 – Servy

答えて

1

もっと良いアプローチは、異なるイベントハンドラの代わりにパラメータを利用することです。

次の例では、Tagプロパティを使用してイベントを送信したパネルを区別していますが、EventArgsを実際に使用してイベント引数を作成し、nullの代わりに送信する必要があります。

void Main() 
{ 
    for(int i = 0; i < 4; i++) 
    { 
     for(int j = 0; j < 4; j++) 
     { 
      myPanels[i, j].Tag = i +" - " + j; 
      myPanels[i, j].Click += button_click; 
      // fire the event, note that the panel instance is the sender 
      myPanels[i, j].OnClick(null); 
     } 
    } 
} 

private void button_click(object sender, System.EventArgs e) 
{ 
    var pnl = sender as Panel; 
    if (pnl != null && pnl.Tag != null) 
     MessageBox.Show("Unique event "+ pnl.Tag.ToString()); 
} 

各パネルに特別な動作を実装する場合は、Panelのサブクラスを作成してインターフェイスを実装できます。

public interface ISpecialMethod{ 
    void SpecialMethod(); 
} 

public class SpecialPanel :Panel, ISpecialMethod { 
    public void SpecialMethod() { 
     /* custom logic*/ 
    } 
} 

private void button_click(object sender, System.EventArgs e) 
{ 
    var pnl = sender as ISpecialMethod ; 
    if (pnl != null) 
     pnl.SpecialMethod(); 
} 

ここから可能性は無限です。

1

それは、これはあなたの本当の状況に移動するための方法では非常に低いですが、あなたが本当に動的にイベントを配線する場合、既存のコードをほんの追加を必要とするには:

myPanels[i, j].Click += (EventHandler) method.CreateDelegate(typeof(EventHandler)); 
+0

私はやろうとしていましたが、もう少し見るともう私はもう分かりません。それは私がやろうとしていたもののように見える。 – Jamin

関連する問題