2013-04-11 52 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 2013-04-11 18:07:57

+0

也许你可以使用'dataGridView1.IsCurrentCellInEditMode'。如果有帮助,不要忘记接受答案。 – 2013-04-11 18:11:52

+0

谢谢Rikki。你非常有帮助。 – Ryan 2013-04-11 18:17:20