手动标记DataGridView

时间:2013-04-03 20:42:31

标签: c# .net datagridview

我有一个带有文本框和一行10列的DataGridView的表单。当用户点击#9列上的TAB时,我希望焦点转到表单的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);
}

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

我将它作为一个网格,可以在任何可能有许多其他控件的表单上工作。这个表格是一个原型,所以它只有一个其他控件。

我错过了什么吗?

1 个答案:

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