ProcessCmdKey方法讓DataGridView按Enter斷行符號鍵轉到下一列的格,使用DataGridView的時候經常需要修改其預設的操作方式,如按Enter斷行符號鍵轉到下一列的格,或直接把Enter當成是Tab鍵。這樣的需求,對於DataGridView來說是很簡單的。你需要做的就是重寫其ProcessCmdKey方法。另一種需求是當編輯的列是某種特定的DataGridViewColumn時,執行特殊的操作。這個過程中我們需要配合DataGridView的系統訊息與DataGridViewColumn的系統訊息來實現一定的功能。
1、將Enter鍵變成Tab鍵
這是一個比較符合普通使用者的操作習慣,對於操作DataGridView,使用ProcessCmdKey方法就足夠了。下面是實現。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
base.ProcessCmdKey(ref msg, keyData);
int WM_KEYDOWN = 256;
int WM_SYSKEYDOWN = 260;
bool _disable = false;
if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSKEYDOWN)
{
switch (keyData)
{
case Keys.Enter:
SendKeys.Send("{Tab}");
_disable = true;
break;
}
}
return _disable;
}
SendKeys.Send就是發送鍵訊息,與使用者直接敲擊鍵盤的鍵是一樣的效果。
上面的方法意思是當傳送的系統訊息是WM_KEYDOWN, WM_SYSKEYDOWN,敲擊的是Enter鍵,就取消這個訊息,並發送Tab訊息鍵。
2、DataGridViewComboBoxColumn的快速下拉
如果你剛剛開始使用DataGirdView,一定覺得ComboBox列好麻煩,如果當前是選定的,點擊一下是開始編輯,再點擊一下下列小箭頭才是下列動作,再選擇項。
假設一下,如果可以這樣:使用者一按鍵盤就馬上下拉,然後是自動篩選,那可能是很好的功能(視不同人的操作習慣而定)。
這個需求是可以達到,在重寫ProcessCmdKey方法時,捕捉A-Z按鍵,並判斷當前的是不是ComboBoxColumn,不過DataGridViewComboBoxColumn需要重新定義,將它分柝為Column,Cell和EditingControl三個檔案。
在ProcessCmdKey重寫時,一捕捉到A-Z按鍵,就Disabled它並發送F2鍵,F2鍵是插入操作符,並需要重定義EditingControl控制項,增加OnKeyUp的重寫,再判斷A-Z的操作,並發送F4鍵,F4是下拉指令鍵。其實,也可以直接在ProcessCmdKey發送F2和F4,不過,到期使用ProcessCmdKey可能是比較麻煩的。