Winform Datagridview处理选项卡和箭头键

时间:2013-04-11 17:45:07

标签: c# winforms datagridview keydown

我想处理DataGridView单元格上的KeyDown事件。我使用以下代码在单元格上获取KeyDown事件:

private void dgvData_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {

            var tb = (DataGridViewTextBoxEditingControl)e.Control;

            tb.KeyDown += cell_KeyDown;
        }

但看起来我无法处理像tab和箭头这样的特殊键。这些键不会转到我的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键。但是,它仍然没有捕获向下和向上箭头键。有什么不对吗?

完美的解决方案是在单元格编辑模式下,它以我的方式处理制表符和箭头键并保留在单元格中。在网格中,箭头和标签键以正常方式工作。

1 个答案:

答案 0 :(得分: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);
}