zoukankan      html  css  js  c++  java
  • [转]捕捉DataGridView的单元格编辑时的键事件

    注意:DataGridView控件是从.NET Framework 2.0版本开始追加的。

    DataGridView的键事件(KeyDown、KeyUp、KeyPress、PreviewKeyDown),在单元格编辑中是不会发生的。是因为单元格进行编辑时是使用了TextBox。所以,捕捉编辑中单元格的键事件,需要捕捉被编辑单元格的TextBox的键事件。

    捕捉被编辑单元格的TextBox的键事件的方法,和这里介绍的方法一样,使用EditingControlShowing事件处理器取得编辑所使用的TextBox,再用AddHandler事件处理器追加。

    注意:使用同一个事件处理器不能多次对同一个TextBox的事件进行追加。所以要在适当的时候(EditingControlShowing事件的最先、CellEndEdit事件)对事件处理器进行删除。

    下面的例子,和「TextBox中只能输入数字」中介绍的一样,使用KeyPress事件TextBox中只能输入数字的代码。例子中在EditingControlShowing事件处理器中对KeyPress事件处理器进行删除(CellEndEdit事件处理器删除的例子,在这里有介绍)。

    private void dgDepotInMx_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                //检测是被表示的控件还是DataGridViewTextBoxEditingControl
                if (e.Control is DataGridViewTextBoxEditingControl)
                {
                    DataGridView dgv = (DataGridView)sender;

                    //取得被表示的控件
                    DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control;

                    //事件处理器删除
                    tb.KeyPress -= new KeyPressEventHandler(dataGridViewTextBox_KeyPress);

                    //检测对应列
                    if (dgv.CurrentCell.OwningColumn.Name == "单价")
                    {
                        // KeyPress事件处理器追加
                        tb.KeyPress += new KeyPressEventHandler(dataGridViewTextBox_KeyPress);
                    }
                }
            }
            private void dataGridViewTextBox_KeyPress(object sender, KeyPressEventArgs e)
            {
               if ((int)e.KeyChar >= 48 & (int)e.KeyChar <= 57 | (int)e.KeyChar == 8 | (int)e.KeyChar == 46)
                {
                    e.Handled = false;
                }
                else
                {
                    e.Handled = true;
                }

    }

          private DataGridViewTextBoxEditingControl EditingControl = null;

            private void dgvMain_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                
                if (this.dgvMain.CurrentCell.RowIndex > -1)
                {
                    if (e.Control is DataGridViewTextBoxEditingControl)
                    {
                        this.EditingControl = (DataGridViewTextBoxEditingControl)e.Control;
                        //增加委托处理
                        this.EditingControl.KeyDown += new KeyEventHandler(this.EditingControl_KeyDown);               
                    }

                }

            }

            private void EditingControl_KeyDown(object sender, KeyEventArgs e)
            {
               //业务处理
               //按上下键时就是不触发该事件
            }

            private void dgvMain_CellEndEdit(object sender, DataGridViewCellEventArgs e)
            {
                if (this.EditingControl != null)
                {
                    EditingControl.KeyDown -= new KeyEventHandler(this.EditingControl_KeyDown);
                    this.EditingControl = null;
                }
            }

  • 相关阅读:
    从DataGridViewer导出Excel
    C#获取特定进程CPU和内存使用率
    51 nod 1265 四点共面
    51nod 1384 全排列
    51nod 2006 飞行员配对
    codeforces 839A
    codeforce 837C
    codeforces 837B
    codoforces 837A
    GIT
  • 原文地址:https://www.cnblogs.com/windy86/p/3023404.html
Copyright © 2011-2022 走看看