C# 의 combobox 에서, 드롭다운의 선택한 값을 받을수 없을 때.
말 그대로다. 이 내용이 어디에도 안 써 있어서 좀 삽질했다.
일단, 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의 사용자 지정값을 못 가져오는 실패코드 ]
삽질에게 명복을...