0

我有一个带有文本框和 1 行 10 列的 DataGridView 的表单。当用户在第 9 列上按 TAB 时,我希望焦点转到表单选项卡顺序(文本框)上的下一个控件。为此,我使用以下代码覆盖 ProcessCmd:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    const int WM_KEYDOWN = 0x100;
    const int WM_SYSKEYDOWN = 0x104;

    if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
    {
        switch (keyData & Keys.KeyCode)
        {
            case Keys.Tab:
            case Keys.Enter:
                if (this.CurrentCell != null && this.CurrentCell.ColumnIndex == 8)
                {
                    Form frmParent = FindForm();
                    frmParent.SelectNextControl(frmParent.ActiveControl, true, true, true, true);
                    return true;
                }
                break;
        }
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

当我运行它时,如果单元格未处于编辑模式,它可以正常工作。但是,如果单元格处于编辑模式,焦点会离开网格,但似乎无处可去。它不在文本框或网格上。但是,如果我随后打开一个新表单,然后切换回该表单,则文本框具有焦点。或者,如果我然后按 Shift+Tab,网格就会获得焦点。

我把它做成一个网格,可以在任何可以有许多其他控件的表单上工作。此表单是一个原型,因此它只有一个其他控件。

我错过了什么吗?

4

1 回答 1

2

我解决了这个问题。我所做的是在调用 SelectNextControl 之前调用 CurrentCell 的 DetatchEditingControl 方法。请看下面的代码:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    const int WM_KEYDOWN = 0x100;
    const int WM_SYSKEYDOWN = 0x104;

    if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
    {
        switch (keyData & Keys.KeyCode)
        {
            case Keys.Tab:
            case Keys.Enter:
                if (this.CurrentCell != null && this.CurrentCell.ColumnIndex == 8)
                {
                    if (this.EditingControl != null)
                        this.CurrentCell.DetachEditingControl();
                    Form frmParent = FindForm();
                    frmParent.SelectNextControl(frmParent.ActiveControl, true, true, true, true);
                    return true;
                }
                break;

        }
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
于 2013-04-04T18:04:34.687 回答