DataGridView捕获上下左右按键

一般对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;
            }
        }

    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值