2013-04-11 3 views
4

DataGridView 셀에서 KeyDown 이벤트를 처리하려고합니다. 셀에 KeyDown 이벤트를 가져 오는 데 다음 코드를 사용합니다.Winform Datagridview 핸들 탭 및 화살표 키

private void dgvData_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
     { 

      var tb = (DataGridViewTextBoxEditingControl)e.Control; 

      tb.KeyDown += cell_KeyDown; 
     } 

그러나 탭과 화살표 같은 특수 키는 처리 할 수없는 것처럼 보입니다. 이러한 키는 내 cell_KeyDown 메서드로 이동하지 않습니다. 그래서 DataGridView의 KeyDown 이벤트에서 처리하려고합니다 :

private void dgvData_KeyDown(object sender, KeyEventArgs e) 
{ 
// handle keys 
} 

그 경우에도 여전히 Tab 키를 캡처 할 수 없습니다. 화살표 키를 캡처 할 수는 있지만 사용자 지정 이벤트를 처리 한 후에도 화살표로 다른 셀로 이동합니다. 나는 세포에 머물고 싶다.

그때 나는이 같은 DataGridView를 확장 :
class DataGridViewSp : DataGridView 
    { 

     protected override bool ProcessDialogKey(Keys keyData) 
     { 
      if (keyData == Keys.Tab) 
      { 
       //todo special handling 
       return true; 
      } 

      else if (keyData == Keys.Down) 
      { 
       //todo special handling 
       return true; 
      } 

      else if (keyData == Keys.Up) 
      { 
       //todo special handling 
       return true; 
      } 
      else 
      { 
       return base.ProcessDialogKey(keyData); 
      } 
     } 
    } 

지금 나는이 재정의 ProcessDialogKey 방법에서 Tab 키를 캡처 할 수 있습니다. 그러나 그래도 아래쪽 화살표 키는 캡처하지 않습니다. 잘못된 것이 있습니까?

완벽한 솔루션은 셀 편집 모드에서 내 방향으로 탭과 화살표 키를 처리하고 셀에 머물러있을 때입니다. 그리드에서 화살표 키와 탭 키가 정상적으로 작동합니다.

답변

3

ProcessDialogKey 대신 ProcessCmdKey을 사용하십시오. 그런 다음 필요한 모든 키를 캡처합니다.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    if (keyData == Keys.Tab) 
    { 
     //todo special handling 
     return true; 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

작동합니다! 감사! 나는 좋은 것을 가지고있다. DataGridview가 셀 편집 모드에 있는지 확인하는 방법은 무엇입니까? 따라서 사용자가 셀을 편집 할 때만 특수 키 처리를 활성화 할 수 있습니다. – Ryan

+0

아마도'dataGridView1.IsCurrentCellInEditMode'를 사용할 수 있습니다. 그것이 도움이된다면 답을 받아 들여야한다는 것을 잊지 마십시오. –

+0

감사합니다. Rikki. 너는 매우 도움이된다. – Ryan