一般对Form的KeyPreview设置为true,然后在From的keydown事件中即可预处理键盘的按键。
但是,对于DataGridView不行。DataGridView控件自行先捕获处理了上下左右、Enter、Tab等按键,以至于你即使在EditingControlShowing事件中截获当前的EditingControl,然后对其设置keydown事件,仍然无法捕获特殊按键,因为这些按键已经被处理了,不再往下传递。
好消息是,Form的ProcessCmdKey方法可以更加提前处理此Form上的按键,对携带的参数keyData过滤处理即可,此方法需要重写。
以下是实例代码:
public partial class Form1 : Form
{
private string conn = @"server=.\sql2005;database=DB_HTGL;uid=sa;pwd=1234";
public Form1()
{
InitializeComponent();
FormSuggest.ConnStr = conn;
}
private Control _editingControl;
public Control EditingControl
{
get { return _editingControl; }
set
{
if (_editingControl==null)
{
_editingControl = value;
_editingControl.KeyDown += _editingControl_KeyDown;
}
}
}
void _editingControl_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F7)
{
FormSuggest.Instance.SelectSql = "SELECT ID 合同号, CUSTOMER_ID 客户 FROM dbo.SALE_CONTRACT";
FormSuggest.Instance.SuggestMode = SelectMode.Left; //匹配模式,默认左匹配。如果是序列号字段,可右匹配模式取尾数匹配
FormSuggest.Instance.ListenerField = "ID";
FormSuggest.Instance.ListenerColumn = "合同号";
FormSuggest.Instance.ListenerControl = _editingControl;
}
}
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
EditingControl = e.Control;
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
bool b = keyData == Keys.Down;
if (b && _editingControl.Focused && FormSuggest.Instance.Visible)
{
FormSuggest.Instance.Focus();
SendKeys.Send("{down}");
return true;
}
b = keyData == Keys.Enter;
if (b && _editingControl.Focused && FormSuggest.Instance.Visible)
{
FormSuggest.Instance.Focus();
SendKeys.Send("{enter}");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
bool b = e.KeyCode == Keys.F7;
if (b&& textBox1.Focused)
{
FormSuggest.Instance.SelectSql = "SELECT ID 合同号, CUSTOMER_ID 客户 FROM dbo.SALE_CONTRACT";
FormSuggest.Instance.SuggestMode = SelectMode.Left; //匹配模式,默认左匹配。如果是序列号字段,可右匹配模式取尾数匹配
FormSuggest.Instance.ListenerField = "ID";
FormSuggest.Instance.ListenerColumn = "合同号";
FormSuggest.Instance.ListenerControl = textBox1;
}
}
}