말 그대로다. 이 내용이 어디에도 안 써 있어서 좀 삽질했다.
일단, MSDN에 나와있는 두 이벤트의 차이점을 보자.
증상은 이러하다.
Combobox 에 사용되는 가장 일반적인 이벤트는 SelectedIndexChanged() 다. 이름부터가 딱 그거같잖아? 사용자가 골랐을 때 실행되는거.
그런데, 이 이벤트의 코드를 다음과 같이 작성하면, 실제로 사용자가 선택한 dropdown 의 text 값을 가져올 수가 없다.
private void ComboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
ComboBox comboBox = (ComboBox) sender;
TextBox1.Text = comboBox.SelectedText; // 실패.
TextBox1.Text = comboBox.Text; // 이것도 실패.
}
[ 예1: combobox의 사용자 지정값을 못 가져오는 실패코드 ]
하지만 이상하지 않은가? ComboBox.SelectedText 는 선택이 안 된 경우 그 값이 NULL 이니까,
만일 저게 UI 상 화면 랜더링이 안됐거나, 값 갱신이 안 된 경우라면 코드가 뻑나야지 ( 메모리 충돌이라던가 Null Exception 이라던가 Segmentation Fault 라던가 ) 코드가 진행되면 안된다.
하지만 현실은 TextBox1.Text 에 ComboBox1 의 text 값이 갱신 안 된 채로, 코드가 진행되어 버린다.
한편, SelectionChangeCommitted() 는 어떠한가?
이 이벤트에 위의 코드를 넣게되면, TextBox1.Text 에 기록되는 값은 ComboBox1 의 "현재선택 이전의 TEXT" 이다. 즉
1, combobox1.items 가 "aaa" ,"bbb", "ccc" 이고,
2. 최초에 "aaa" 를 선택
3. 2회째에 "bbb" 를 선택
하면, TextBox1.Text 에는
4. 처음에 "" (공백) 표시
5. 두번째 "aaa" 표시
가 된다.
즉, 이전에 선택한 게 표시되는 것. 아마도 랜더링 순서나 갱신 순서... 뭐 그런 문제겠지.
그래서, 요점은, 간단할 것 같은 코드지만, 위의 박스 안의 방법처럼 하면 안된다는 것.
이벤트 자체는 SelectedIndexChanged() 가 맞다. 하지만 값을 가져올 때 SelectedText 를 쓰지 말고, SelectedItem 을 쓰자.
private void ComboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
ComboBox comboBox = (ComboBox) sender;
TextBox1.Text = ( string )comboBox.SelectedItem;
}
[ 예1: combobox의 사용자 지정값을 못 가져오는 실패코드 ]
삽질에게 명복을...
'프로그램 > C#' 카테고리의 다른 글
C#에서, PictureBox 의 이미지를 파일에서 Load 할 때, 파일이 사용중으로 나오는 경우. (1) | 2016.10.31 |
---|---|
C#에서 압축 작업할 때, ZipFile 클래스 / 객체가 없다고 나오는 경우. (0) | 2016.06.12 |
ms access 에서 ISNULL() 쿼리함수. (0) | 2016.03.31 |
C#에서 ms access 암호 있을때 connection string + 코드로 mdb 암호 변경 수정. (0) | 2016.03.24 |
C#에서, webbrowser 의 documentText 갱신 방법. (0) | 2016.03.05 |