2011-08-03 4 views
3

사용자가 목록 상자에서 항목을 클릭하면 listboxItems_SelectedIndexChanged가 호출됩니다. 그러나 사용자가 항목을 놓치고 항목이 아닌 목록 상자를 무작위로 클릭하는 경우에도 listboxItems_SelectedIndexChanged가 계속 호출됩니다.마우스 클릭이 목록 상자에없는 항목에 도달하는지 검색합니다. [C#]

어떻게 변경할 수 있습니까? 항목 클릭에 대한 작업 만 원합니다.

참고 : 키보드로 응용 프로그램을 탐색하는 기능을 제거하는 것은 옵션이 아닙니다.

+0

Winforms? 그렇다면, 태그에 추가하십시오. –

+0

@Merlyn,리스트 박스를 사용하고 있기 때문에 꽤 분명합니다. –

+0

- WPF에는 ListBox 컨트롤도 있습니다. Merlyn의 의견을보기 전에 실제로 귀하의 질문에 대한 답변을 드릴 것입니다. – Eternal21

답변

0

나는 그러므로 당신이 어떤 경우에 당신이 당신의 통제에 충분한 목록 항목이없는 추측 어떤 공간을 클릭하면 SelectedIndexChanged이 (가) 해고되었습니다.

컨트롤의 크기를 항상 목록 항목의 수에 맞게 조절할 수 없거나이 질문을하지 않는 것이 좋습니다.

사용자가 동일한 목록 항목을 클릭 (선택)하면 어떻게됩니까? 선택한 인덱스가 동일하더라도 일부 논리가 발생해야합니까? (동일한 논리가 처음 발생했을 때 클릭 한 경우)?

당신은 다음과 같은 해킹을 사용할 수 한 번 무시해야보다 더 많은 같은 인덱스를 선택하는 것이 필요한 경우 :

양식 범위 (목록 상자 컨트롤을 포함하는 양식) 각 시간 선택에 변수를 유지 인덱스 변경은 해당 변수를 설정합니다. 그런 다음 나중에 이벤트 처리를 무시하도록 동일한 선택이 이루어 졌는지 확인하십시오. 여기에 한 예가 나와 있습니다.

private int _currSelIdx = -1; // Default value for the selected index when no selection 
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
     if (listBox1.SelectedIndex == _currSelIdx) 
     return; 

     Console.WriteLine(listBox1.SelectedIndex); 
     _currSelIdx = listBox1.SelectedIndex; 
} 

어쨌든간에 ... 어떤 작품이든!

0

아마도 SelectedIndexChanged는 키보드를 사용하여 선택을 변경해도 트리거되므로 논리를 배치하기에 적합한 위치가 아닐 수도 있습니다. 대신 MouseClick을 사용하여 선택한 항목, 즉 다음과 같은 항목에 클릭이 발생했는지 확인합니다.

private void listBox1_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (listBox1.SelectedIndex < 0 || !listBox1.GetItemRectangle(listBox1.SelectedIndex).Contains(e.Location)) 
      MessageBox.Show("no click"); 
     else 
      MessageBox.Show("click on item " + listBox1.SelectedIndex.ToString()); 
    } 
+0

키보드 탐색 기능을 제거하는 것은 옵션이 아닙니다. –

+0

"항목 클릭에 대한 조치 만 원합니다"라고 썼기 때문에 명확하지 않았습니다. 이 카스에서 나는 tzup이 당신에게가는 길을 보여줬다 고 생각합니다. –

관련 문제