最近在開發一個項目時,要求某一列只能夠輸入數字,其它的字元都不接受,Microsoft 沒有提供這個功能,只能自己用代碼實現,在網上找了一下,大多數都在輸入完成後才驗證的。這樣不爽,我這個代碼可以在輸入進就屏蔽了非數位字元。主要是在 EditingControlShowing事件中完成 。看代碼:
public DataGridViewTextBoxEditingControl CellEdit = null; // 聲明 一個 CellEdit
private void datagridyf_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
CellEdit = (DataGridViewTextBoxEditingControl)e.Control; // 賦值 CellEdit.SelectAll();
CellEdit.KeyPress += Cells_KeyPress; // 綁定到事件
}
// 自訂事件
private void Cells_KeyPress(object sender, KeyPressEventArgs e)
{
if (datagridyf.CurrentCellAddress.X == 2) // 判斷當前列是不是要控制的列 我是控制的索引值為2的 列(即第三列)
{
if ((Convert.ToInt32(e.KeyChar) < 48 || Convert.ToInt32(e.KeyChar) > 57) && Convert.ToInt32(e.KeyChar) != 46 && Convert.ToInt32(e.KeyChar) != 8 && Convert.ToInt32(e.KeyChar) != 13)
{
e.Handled = true; // 輸入非法就屏蔽
}
else
{
if ((Convert.ToInt32(e.KeyChar) == 46) && (txtjg.Text.IndexOf(".") != -1))
{
e.Handled = true;
}
}
}
}
下面是在輸入完成後才驗證的 這個主要是在 CellValidating事件中完成
private void datagridyf_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{ if (e.ColumnIndex == datagridyf.Columns["Pric"].Index )
{
datagridyf.Rows [e.RowIndex].ErrorText ="";
int NewVal=0;
if (!int.TryParse (e.FormattedValue.ToString (),out NewVal ) || NewVal <0)
{
e.Cancel=true ;
datagridyf.Rows [e.RowIndex].ErrorText ="價格列只能輸入數字";
return ;
}
}
}