2013-04-03 45 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); 
}