在DataGridView中按Tab和回车的响应事件

时间:2022-06-10 14:47:03
dyhgoa兄:你好,,谢谢你曾经帮助,,但这个按Tab和回车键无法响应事件,我用KeyUp和KeyPress都不行,,请问有其它方法吗,,
你曾帮我的网址:http://topic.csdn.net/u/20090201/15/7e6ac895-1832-4cdb-9548-55d3342652e1.html,,谢谢

我的代码:
void dgvEmp_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            DataGridViewTextBoxEditingControl ctlTxt = (DataGridViewTextBoxEditingControl)e.Control;
            if (ctlTxt != null)            {

                ctlTxt.KeyDown += new KeyEventHandler(ctlTxt_KeyDown);
            }
        }

        void ctlTxt_KeyDown(object sender, KeyEventArgs e)
        {
            string str = "";
        }

2 个解决方案

#1


Tab和Enter键在DataGridView中有约定俗成的作用。
实际上Tab/Enter在消息预处理的时候就被处理了,起到上下导航或关闭编辑控件等作用,而不会再派发给具体的TextBoxEditingControl。

所以,当TextBox让它的父控件进行消息预检查的时候,父控件要说他不处理:

    class MyDGV : DataGridView
    {
        protected override bool ProcessKeyPreview(ref Message m)
        {
            if (this.EditingControl is DataGridViewTextBoxEditingControl)
            {
                KeyEventArgs e = new KeyEventArgs(((Keys)((int)m.WParam)) | Control.ModifierKeys);
                if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab)
                {
                    return false;
                }
            }
            return base.ProcessKeyPreview(ref m);
        }
    }
    //记得在Form1.Designer.cs中创建DataGridView要换成:this.dataGridView1 = new MyDGV();


同时,要让TextBox愿意接受那些特殊按键:

    void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        DataGridViewTextBoxEditingControl textEditor = e.Control as DataGridViewTextBoxEditingControl;
        if (textEditor != null)
        {
            textEditor.AcceptsReturn = true;
            textEditor.Multiline = true;
            textEditor.AcceptsTab = true;
            textEditor.KeyDown += new KeyEventHandler(textEditor_KeyDown);
        }
    }

    void textEditor_KeyDown(object sender, KeyEventArgs e)
    {
        System.Diagnostics.Trace.TraceInformation(sender + "....." + e.KeyCode);
    }


上述代码使你可以响应Tab和回车键事件。

改变Tab/Enter键的默认作用会给那些习惯于用Tab键移动到下一单元的用户感到不适应(再去点鼠标?)。
同时DataGridView的单元格的固定高度也并不适合显示多行的文本(Shift+Enter可输入多行文本)。
俗话说强扭的瓜不甜,我会建议用一个其他控件来另外编辑需要多行和Tab格的文本,而不要让TextBoxEditingControl来做它不适合做的任务。

#2


谢了,,

#1


Tab和Enter键在DataGridView中有约定俗成的作用。
实际上Tab/Enter在消息预处理的时候就被处理了,起到上下导航或关闭编辑控件等作用,而不会再派发给具体的TextBoxEditingControl。

所以,当TextBox让它的父控件进行消息预检查的时候,父控件要说他不处理:

    class MyDGV : DataGridView
    {
        protected override bool ProcessKeyPreview(ref Message m)
        {
            if (this.EditingControl is DataGridViewTextBoxEditingControl)
            {
                KeyEventArgs e = new KeyEventArgs(((Keys)((int)m.WParam)) | Control.ModifierKeys);
                if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab)
                {
                    return false;
                }
            }
            return base.ProcessKeyPreview(ref m);
        }
    }
    //记得在Form1.Designer.cs中创建DataGridView要换成:this.dataGridView1 = new MyDGV();


同时,要让TextBox愿意接受那些特殊按键:

    void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        DataGridViewTextBoxEditingControl textEditor = e.Control as DataGridViewTextBoxEditingControl;
        if (textEditor != null)
        {
            textEditor.AcceptsReturn = true;
            textEditor.Multiline = true;
            textEditor.AcceptsTab = true;
            textEditor.KeyDown += new KeyEventHandler(textEditor_KeyDown);
        }
    }

    void textEditor_KeyDown(object sender, KeyEventArgs e)
    {
        System.Diagnostics.Trace.TraceInformation(sender + "....." + e.KeyCode);
    }


上述代码使你可以响应Tab和回车键事件。

改变Tab/Enter键的默认作用会给那些习惯于用Tab键移动到下一单元的用户感到不适应(再去点鼠标?)。
同时DataGridView的单元格的固定高度也并不适合显示多行的文本(Shift+Enter可输入多行文本)。
俗话说强扭的瓜不甜,我会建议用一个其他控件来另外编辑需要多行和Tab格的文本,而不要让TextBoxEditingControl来做它不适合做的任务。

#2


谢了,,