2012-08-10 2 views
4

VS2010 C# .Net 4.1IsInputKey가 true로 설정된 경우 PreviewKeyDown 이벤트가 두 번째로 호출되는 이유는 무엇입니까?

사용자가 ComboBox에 초기 데이터를 선택하거나 입력해야하는 양식 작업 중입니다. 추측하는 데 시간이 걸리는 아래 코드를 사용하여 데이터가 맞으면 사용자가 Tab 키를 누를 때 편집 버튼을 사용할 수 있습니다. 그렇지 않으면 버튼이 비활성화되어 다음 버튼으로 이동합니다.

이 코드는 작동하지만 IsInputKey을 true로 설정하면 PreviewKeyDown 이벤트가 다시 발생합니다. 이렇게하면 유효성 검사가 두 번 호출됩니다. KeyDown 이벤트는 한 번만 호출되며 두 번째 호출에서는 IsInputKey이 다시 거짓이므로 유효성 검사를 다시 확인해야합니다.

저는 왜 그런지 이해하고 싶습니다.

private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { 
    if (e.KeyData == Keys.Tab) { 
    if (ValidationRoutine()) { 
     e.IsInputKey = true; //If Validated, signals KeyDown to examine this key 
    } //Side effect - This event is called twice when IsInputKey is set to true 
    }   
} 

private void comboBox1_KeyDown(object sender, KeyEventArgs e) { 
    if (e.KeyData == Keys.Tab) { 
     e.SuppressKeyPress = true; //Stops further processing of the TAB key 
     btnEdit.Enabled = true; 
     btnEdit.Focus(); 
    } 
} 
+0

는 PreviewKeyDown이 /가 .. 실제에서 KeyDown 이벤트 전에 트리거됩니다 발생 ... 당신이 PreviewKeyDown의 코드를 제거하고 다른 이벤트 처리기에 코드를 추가하는 시도 – MethodMan

+0

@DJ 크라는-이이었다 그것되어 있습니다 KeyDown 이벤트에서 Tab이 눌려 지도록 허용해야합니다. 내가 그것을 서 프레스하지 않으면 내 목표 버튼이 제때에 활성화되지 않았기 때문에 순서의 다음 버튼으로 포커스가 이동합니다. 나는 다른 곳에서 전체 유효성 검사를 할 수 있으며이 테스트에 대한 간단한 플래그를 확인할 수 있습니다. 하지만 왜 두 번 부름 받았는지 알고 싶습니다. –

답변

5

이유는 무엇입니까? Winforms가 대답하기는 어렵습니다. 먼저 메시지 루프에서 다시 컨트롤의 메시지 발송자로부터. 이 이벤트는 컨트롤 클래스를 재정의 할 필요없이 보호 된 IsInputKey() 메서드를 구현할 수있는 대체 방법입니다. 해킹 비트, 항상 무시하고 이벤트를 사용하지.

더 나은 마우스 트랩은 대신 ProcessCmdKey()를 재정의하는 것입니다. 이처럼 :

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
     if (this.ActiveControl == comboBox1 && keyData == Keys.Tab) { 
      if (ValidationRoutine()) { 
       btnEdit.Enabled = true; 
       btnEdit.Focus(); 
       return true; 
      } 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
+1

이 기능은 자동 완성이 켜져 있어도 작동합니다. 원래 질문에이 답변을 게시 하시겠습니까? http://stackoverflow.com/questions/11895235. 고맙습니다! 나는이 사소한 UI 기능에 너무 많은 시간을 보냈지 만 지금은 앞으로 어떤 일을 할 것입니다! –

관련 문제