Form窗体上有个DataGridView控件,和“确定”、“取消”按钮。
DataGridView.ReadOnly = true;// 只读,用于选取记录。
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;// “确定”铵钮
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;// “取消”按钮
this.AcceptButton = this.btnOK;// 已设置窗体默认按钮。
this.CancelButton = this.btnCancel;
DataGridView控件获得焦点后,当用户用方向键“↑”、“↓”选定了记录时,按下“回车”键却跳到了下一行记录。
我希望按“回车”键后响应“确定”按钮,请问要如何实现?

解决方案 »

  1.   

    监测按键值,keycode=13触发事件
      

  2.   

    窗体的 KeyPreview 设置为 true;
    给窗体加个 KeyUp 事件 void Form2_KeyUp(object sender, KeyEventArgs e)
            {
                btnOK.PerformClick();
            }
      

  3.   


    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                     // do sth
                }
            }
      

  4.   


            private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    button_Click(this.button, new EventArgs());
                }
            }
      

  5.   

    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                     btnOK.PerformClick(); 
                }
            }
      

  6.   

    谢谢大家的热情回复,这些方法应该可行。
    不过我的DataGridView控件做成了用户自定义类,所有窗口调用了此类。
    DataGridView控件为只读状态并获得焦点敲“回车”时,要执行窗体默认按钮,要如何做到这种通用呢?
    不希望每个窗体都去增加代码。
      

  7.   

    你可以在类里定义一个委托,
    在 DataGridView控件为只读状态并获得焦点敲“回车”时 调用哪个委托在每个加载DataGridView控件 的Form 中 将默认按钮的单击事件赋给委托
      

  8.   

    还有没有更简单高效的方法?比如只需在DataGridView自定义类中添加代码,即可应用到全局。无需到每个Form窗体中添加任何代码。
      

  9.   

    楼主应该是要解决按下回车以后,datagirdview当前行不往下移的问题吧?
    正好手头有一个VB.net的类,因本人比较懒,就不用C#重写了 Public Class datagridviewX
        Inherits DataGridView '继承dataGridView    Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
            If keyData = Keys.Enter Then
                Return True
            End If
            Return MyBase.ProcessCmdKey(msg, keyData)
        End Function
    End Class继承,重写datagirdview类,编译后,把这个类拖到窗体上就行了。这样,按回车后,记录不会往下移,关于ENTER的捕捉事件就如4楼的兄弟说的那样就行了。
      

  10.   

    谢谢12楼!VB代码可以看得懂。回车后实现了不往下移,但却不执行Form窗体上的“确定”按钮。protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == Keys.Enter)
            return true;
        else
            return base.ProcessCmdKey(ref msg, keyData);
    }
      

  11.   

    其实只解决了一半,还需要在Form窗体上写代码才可以。
    不知道有没有什么方法在DataGridView自定义类中一次解决?
      

  12.   


            private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {                
                    Control c = sender as Control;
                    if (c != null)
                    {
                        Form f = c.FindForm();
                        f.AcceptButton.PerformClick();
                    }
                 }
             }
      

  13.   

    非常感谢大家,特别是“youcaicai”和“Sandy945”,你们俩的回复结合在一起便解决了我的难题。