【问题标题】:Winform Datagridview handle tab and arrow keysWinform Datagridview 句柄选项卡和箭头键
【发布时间】:2013-04-04 00:56:44
【问题描述】:

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

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 键。但是,它仍然没有捕获向下和向上箭头键。有什么问题吗?

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

【问题讨论】:

    标签: c# winforms datagridview keydown


    【解决方案1】:

    使用ProcessCmdKey 代替ProcessDialogKey。然后,您将捕获所需的所有密钥。

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

    【讨论】:

    • 有效!谢谢!我有一个很好的功能。如何检查datagridview是否处于单元格编辑模式?所以我只能在用户编辑单元格时启用我的特殊键处理。
    • 也许你可以使用dataGridView1.IsCurrentCellInEditMode。如果有帮助,请不要忘记接受答案。
    • 谢谢瑞奇。你很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多