지난 포스트에 이어서...
var list = new List<int>(10);
var menu = new ToolStripMenuItem("메뉴");
for(int i=0; i<list.Count; i++) {
var subMenu = new ToolStripMenuItem("메뉴 항목");
subMenu.Click += ( (sender, args)=>{ subMenu_Click(sender, i); } ); // closure
}
void subMenu_Click(object sender, int idx)
{
MessageBox.Show(string.Format("{0}이 클릭됨", idx));
}
예상되는 결과는? i번째 subMenu를 누르면 i가 출력되지 않는다.
다음과 같이 변수를 한 번 복사하는 게 해결책이다:
for(int i=0; i<list.Count; i++) {
var subMenu = new ToolStripMenuItem("메뉴 항목");
int j=i; // 이거면 되지 않을까 했는데 진짜 됐음-_-乃
subMenu.Click += ( (sender, args)=>{ subMenu_Click(sender, j); } ); // closure
}
해결하고 나서 stackoverflow에 질문을 올렸는데
Google: passing parameter evenhandler value changes C#
이걸로 검색하니까 금방 나옴.
역시 원리는 안 찾아보고 하니까 이유는 모른다.
아래 링크에 이유가 있다고 하는데 읽기는 귀찮다.
http://stackoverflow.com/questions/2226510/closures-in-c-sharp-event-handler-delegates
http://stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop
Subscribe to:
Post Comments (Atom)
창 핸들을 만드는 동안 오류가 발생했습니다
System.ComponentModel.Win32Exception was unhandled MyForm w = new MyForm IntPtr handle = wnd.Handle; // Exception occurs here class MyFo...
-
텍스트박스에서 엔터를 치면 자동으로 입력되게 하려고 keyup 이벤트 핸들러를 등록했다. 잘 동작하는 듯했는데 alert창을 닫아도 닫아도 계속 열리는 것이다. 크롬이어서 다행이지 IE였으면 무한히 열렸을 거야...스페이스바로 눌러보길 잘했...
-
1. 아이튠즈 다운로드 https://www.apple.com/kr/itunes/download/ 1-0) 흑우 같이 검정색 Get it from Microsoft 버튼 누르고 스토어 들어가지 말고 1-1) 아래로 내려가서 다른 버전을 찾고 있다면?...
-
진짜 되는 건 아니고 흉내낼 수는 있다. 새 창을 누르면 아무 것도 안 변한 것 같지만 PowerPoint 창 제목이 바뀌어 있다: 프레젠테이션1:2에서 :2 부분이 같은 파일을 연 창 여러 개 중 2번째라는 뜻이다('프레...
No comments:
Post a Comment