注意: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;
}
}