2010-11-18 2 views
2

C#의 Windows Forms에서 작업 중입니다. 나는 내가 ContextMenuMenuItem의를 추가하고 방법을하고 난 아래와 같은 MenuItem들에 대한 이벤트 핸들러 구현 : 값을 전달하기 위해 C#에서 메뉴 항목을 처리하는 방법

public void Form1_Load() 
{ 
    int index =0; 
    ArrayList ar = new ArrayList(); 
    ContextMenu cm = new ContextMenu(); 
    cm.Name = "Test"; 
    MenuItem mi = new MenuItem("All"); 
    mi.Click += new EventHandler(mi_All); 
} 
private void mi_All(object sender,EventArgs e) 
{ 
    //here I want to access the arraylist and integer specified in above method 
} 

방법이 작업을 수행 할 수 있습니까? 한 가지 가능한 해결책은 전역 변수로 ArrayListint을 선언하는 것입니다. 그러나 이와 같은 많은 변수가 있습니다. 이 방법을 사용하면 양식이 삭제 될 때까지 변수가 유지됩니다. 그래서 이것은 효과가 없습니다. 이것을 달성하는 다른 방법이 있습니까?

+0

질문 왜 배열 목록에 액세스해야합니까입니까? 추가 저장을 위해 메뉴 항목의 tag 속성을 사용하는 것을 고려하십시오. –

답변

3

MenuItem에는 사용자 정의 정보를 할당하는 데 사용할 수있는 Tag 속성이 있습니다. 따라서 이벤트 핸들러가 호출 될 때 액세스해야하는 것은 무엇이든 할당하십시오. 위 예제에서 enu 항목의 정수 인덱스를 할당 한 다음 이벤트 핸들러 내부에서이를 Form 레벨 ArrayList 필드의 인덱스로 사용합니다.

4

하나의 옵션 :

mi.Click += delegate (object sender, EventArgs e) { mi_All(sender, e, ar, index); }; 
... 
private void mi_All(object sender, EventArgs e, ArrayList ar, int index) 
{ 
    ... 
} 

또 다른 :

mi.Tag = new object[] { ar, index }; 
... 
private void mi_All(object sender, EventArgs e) 
{ 
    ArrayList ar = (ArrayList)((object[])((MenuItem)sender).Tag)[0]; 
    int index = (int)((object[])((MenuItem)sender).Tag)[1]; 
    ... 
} 
+0

액세스 할 수 있습니다. 솔루션을 가져 주셔서 감사합니다. 마찬가지로 이벤트 처리기 메서드에서 업데이트 될 인덱스를 반환하려는 경우이 방법이 필요합니다. 저에게 알려주세요. – ASD

관련 문제