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