我在作一個關於記件工資系統時候,datagridview 按斷行符號鍵預設是向下一行移動,操作文員為了輸入更快一點,需要按斷行符號鍵就橫向移動繼續輸入資料,其操作文員主要用右手操作鍵盤的數字鍵地區,每天輸入量大,所以必須要解決這個實際問題.
我在網上搜尋了一些:
private void dgv_jj_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
MessageBox.Show("enter");
SendKeys.Send("{TAB}");
SendKeys.Send("{UP}");
}
}
private void dgv_jj_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.Handled = true;
SendKeys.Send("{TAB}");
}
}
等等關於datagridview鍵盤的事件都沒有反應!納悶,微軟既然設計了此事件為什麼沒有反映呢?網上也是千篇一律的這樣的代碼,那些人我懷疑跟本沒有編譯運行過,就在那揭貼!
原來主要是因為快速鍵與菜單捷徑被稱為命令鍵,命令鍵也就始終比常規輸入鍵具有優先權。命令鍵的鍵盤響應已經被控制項封裝為protected型了。控制項編寫人員把多個預定義的鍵盤綁定方案封裝起來,稱為快速鍵。我們在Keydown/KeyPress中沒辦法攔截到Enter、SHIFT、CTRL 、ALT 鍵和其它一些鍵盤按鍵正是這個原因。為解決這些問題VS.NET給出了ProcessCmdKey 方法,我們可以通過重寫datagridview 的ProcessCmdKey方法來改變其命令索引值的相應事件 。
後來,我還是在網上找到真正的揭貼代碼:重寫datagridview控制項相關事件.
整個類代碼:
using System;
using System.Collections.Generic;
using System.Text;
namespace MIS.Wage
{
class mygridview : System.Windows.Forms.DataGridView
{
protected override void OnKeyUp(System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode == System.Windows.Forms.Keys.Enter)
{
e.Handled = true;
// MessageBox.Show("enter");
// System.Windows.Forms.SendKeys.Send("{TAB}");
//System.Windows.Forms.SendKeys.Send("{UP}");
// System.Windows.Forms.SendKeys.Send("{RIGHT}");
}
}
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
switch (keyData)
{
case System.Windows.Forms.Keys.Enter:
System.Windows.Forms.SendKeys.Send("{TAB}");
// System.Windows.Forms.SendKeys.Send("{UP}");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
}
編譯後,再在視窗設計地區工具箱裡直接拖出即可利用!我測試過,沒問題!