[그림 1] ListBox의 빈 공간


ListBox에서 항목을 더블 클릭하여 선택된 항목에 대한 이벤트를 처리하고 싶은데,

MouseDoubleClick 이벤트나 DoubleClick 이벤트를 이용하면 [그림 1]의 하늘색으로 표시한 곳과 같이 

리스트 박스 내 항목이 없는 빈공간에서 더블클릭을 해도 이벤트가 발생합니다.

보통은 빈 공간에 더블클릭을 했을 때는 이벤트가 발생하지 않기를 원하겠죠?


이를 해결하기 위해서는 ListBox의 IndexFromPoint 메서드를 사용하면 됩니다.


메서드 시그너쳐는 다음과 같습니다.


  • int IndexFromPoint(Point p)
    • Point 타입의 p 좌표에 위치한 항목의 인덱스 반환

  • int IndexFromPoint(int x, int y)
    • x, y 좌표에 위치한 항목의 인덱스 반환


위 메서드는 매개변수로 전달된 좌표에 항목이 존재하면 해당 항목의 인덱스를 반환하고,

빈 공간인 경우는 -1을 반환합니다.


이벤트 핸들러로 전달된 MouseDoubleClick 객체에는 이벤트가 발생한 마우스의 좌표값을 가지고 있으므로

이 좌표값과 IndexFromPoint 메서드를 이용하면 더블클릭한 항목을 알 수 있습니다.



[그림 1]의 폼을 이용하여 리스트 박스에서 더블클릭한 항목을 얻는 예를 보겠습니다.

먼저 [그림 1]과 같이 리스트 박스와 텍스트 박스를 배치하고, 리스트 박스에 적당한 항목을 추가합니다.

'언어 목록'에서 더블클릭한 항목을 '선택한 언어'란에 표시하도록 해보겠습니다.


리스트 박스를 선택한 후 속성 창에서  모양을 눌러 이벤트 연결 탭으로 이동 후

MouseDoubleClick 항목의 오른쪽 빈 공간을 더블클릭 해서 이벤트 핸들러를 생성해 줍니다.

(리스트 박스를 더블클릭 하면 리스트 박스의 기본 이벤트인 SelectedIndexChanged 핸들러가 생성됩니다.)


[그림 2] MouseDoubleClick 이벤트 핸들러 추가



[그림 3] 생성된 MouseDoubleClick 이벤트 핸들러



이벤트 핸들러가 생성되면 아래와 같이 코드를 입력합니다.

여기서 제가 만든 리스트 박스의 이름은 lbLanguages 이고 텍스트 박스는 tbSelectedLanguage 입니다.


private void lbLanguages_MouseDoubleClick(object sender, MouseEventArgs e)
{
      // 인덱스를 저장할 변수
      int selectedIndex = -1;

      // 마우스 포인터의 위치
      Point point = e.Location;

      // 리스트 박스의 IndexFromPoint 메서드 호출
      selectedIndex = lbLanguages.IndexFromPoint(point);

      if(selectedIndex != -1) // 빈 공간이 아닌 곳을 더블클릭 했을 때.
      {
          // 선택된 항목 저장
          string selectedItem = lbLanguages.Items[selectedIndex] as string;

          // 선택한 항목으로 텍스트 대입
          tbSelectedLanguage.Text = selectedItem;
      }
 }


소스 코드를 다 쓰신 후 Ctrl + F5 키를 눌러 실행해서 리스트 박스에서 더블클릭 해 보면

빈 공간에서는 아무런 처리를 하지 않고, 항목이 있는 곳에서만 해당 항목을 텍스트 박스에 표시합니다.


[그림 4] 실행 결과



'밤을 지새다' 카테고리의 다른 글

Google Drive를 이용한 파일 버전 관리  (0) 2013.05.24
Linux Kernel Map  (0) 2013.03.24
네이트온 광고와 팝업 없애기  (3) 2012.05.16
파일의 확장자를 보는 방법  (0) 2012.05.16
Gmail 실행파일 첨부 문제  (0) 2012.05.16

+ Recent posts