捕捉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; } }
转: https://www.cnblogs.com/windy86/archive/2013/04/16/3023404.html