2014-05-17 1 views
2

좋아,이 지점을 신속하게 유지하려고합니다.특정 하위 컨트롤에 키보드 입력 보내기

C# Winforms에는 DataGridview와 텍스트 상자를 표시하는 GUI 창이 있습니다. 기본적으로 위 화살표 키 또는 아래 화살표 키를 누르면 목록을 통해 위아래로 이동하기 위해이 입력을 DataGrid 뷰로 직접 보내려합니다. 다른 키를 누르면이 입력을 텍스트 상자에 보내려고합니다.

나는 ProcessCmdKey 메서드를 덮어 쓰려고 시도했지만 keyData 키 코드를 기반으로 포커스를 설정했지만 첫 번째 키를 누르면 컨트롤 포커스 만 설정됩니다. 그러면 두 번째 키 누름이 실제로 포커스를 맞출 것입니다. 제어. 그 하나의 주요 지연없이 입력이 즉시 작동하도록하고 싶습니다.

추가 세부 사항 :

GUI 클래스는 제네릭 클래스입니다.

희망적이라고 생각하세요! 자세한 내용이 필요한 경우 수정하겠습니다. 감사합니다!

+0

코드를 추가하면 더 쉽게 작업 할 수 있습니다. – rene

+0

나는 코드를 추가 할 것이지만 문자 그대로 if (key == 위 또는 아래) grid.focus();와 같은 if 문이었습니다. 나는 그것이 작동하기를 바라는 몇 가지 간단한 것을 시도하고 있었다. –

답변

3

이 작업은 까다 롭습니다. DataGridView는 조작하기가 어렵습니다. ProcessUpKey() 및 ProcessDownKey() 메서드가 있지만 보호되어 있습니다. 클래스를 재정 의하여 public 메서드를 추가해야 호출 할 수 있습니다. 키보드 메시지가 생길 때까지 이미 포커스가있는 창에 커밋되어 있기 때문에 시도한 작업이 실패했습니다.

기존 폼을 크게 변경하지 않고 작동되는 sly hackorama 비트는 키보드 메시지를 다시 게시하는 것이지만 이번에는 DataGridView를 대상 윈도우로 게시하는 것입니다. 이 스 니펫을 양식 클래스에 붙여 넣으십시오.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    if (msg.HWnd != dataGridView1.Handle && (keyData == Keys.Up || keyData == Keys.Down)) { 
     PostMessage(dataGridView1.Handle, msg.Msg, msg.WParam, msg.LParam); 
     return true; 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 
+0

훌륭한 답변, 대단히 감사합니다. 완벽하게 작동했습니다! –

관련 문제