2013-04-03 43 views
0

我有一个带有1行和10列的Textbox和DataGridView的表单。当用户在列#9上点击TAB时,我希望焦点转到窗体的Tab键顺序(文本框)上的下一个控件。要做到这一点,我重写ProcessCmd与此代码:手动剔出DataGridView

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,网格会变得焦点。

我把它作为一个网格,可以在任何可能有许多其他控件的窗体上工作。这种形式是一个原型,所以它只有一个其他的控制。

我错过了什么吗?

+0

你为什么不尝试在开关的情况下进行检查,如果是在编辑模式下,尽量节省/执行'frmParent.SelectNextControl之前首先取消更改(frmParent.ActiveControl ,true,true,true,true);' – Ruly 2013-04-04 00:56:13

+0

该代码被简化为专注于我遇到的问题。实际的代码在调用SelectNextControl之前验证并保存更改。 – 2013-04-04 18:08:49

回答

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); 
}