2017-12-15 19 views
0

Panel[,] 내에 여러 개의 패널이있는 windows- 폼이 있습니다. 사용자가 패널을 클릭 할 때마다 클릭 한 패널을 처리 할 특정 이벤트가 필요합니다. 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 속성을 사용하여 이벤트를 보낸 패널을 구분하지만 실제로 이벤트 인수를 만들고 null 대신 해당 이벤트를 보내서 EventArgs를 활용해야합니다.

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