我在作一个关于记件工资系统时候,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);
}
}
}
编译后,再在窗口设计区域工具箱里直接拖出即可利用!我测试过,没问题!