프로그램/C#

C# 의 combobox 에서, 드롭다운의 선택한 값을 받을수 없을 때.

(주)CKBcorp., 2016. 4. 13. 06:00
반응형


말 그대로다. 이 내용이 어디에도 안 써 있어서 좀 삽질했다.


일단, MSDN에 나와있는 두 이벤트의 차이점을 보자.


https://msdn.microsoft.com/ko-kr/library/system.windows.forms.combobox.selectionchangecommitted(v=vs.110).aspx


https://msdn.microsoft.com/ko-kr/library/system.windows.forms.combobox.selectedindexchanged(v=vs.110).aspx


증상은 이러하다. 

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의 사용자 지정값을 못 가져오는 실패코드 ]




삽질에게 명복을...


반응형