1. 程式人生 > >DataGridView在Cell編輯狀態響應回車鍵下的KeyPress/KeyDown/KeyUp事件

DataGridView在Cell編輯狀態響應回車鍵下的KeyPress/KeyDown/KeyUp事件

我們知道由於DataGridView的單元格DataGridCell處於編輯的時候,當你按Enter鍵,那麼DataGridView是不會激發KewPress/KeyDown/KeyUp這些事件的,因為這個時候的DataGridView是一個容器。

在DataGridView 單元格編輯狀態時

按回車時 判斷這個單元格的內容是否確定

如果正確游標進入下一行對應的列的單元格中

如果不正確游標還是停留本單元格中

我們無法直接在DataGridView的KeyPress事件中做處理,原因上面已經說明,也無法使用CellEndEdit這個事件,因為這個事件不一定是通過Enter來觸發的,直接滑鼠移動到其他單元格也會的,因此我們需要修改一下:

建一個類:

namespace WindowsFormsApplication
{
public sealed class MyDataGridView : DataGridView
{

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter)
{
this.OnKeyPress(new KeyPressEventArgs('r'));
return true;
}
else
return base.ProcessCmdKey(ref msg, keyData);
}
}
}

然後將這個控制元件拖到窗體中 新增KeyPress事件
private void myDataGridView1_KeyPress(object sender, KeyPressEventArgs e)
{

if (e.KeyChar == 'r')
{
DataGridView dgv = sender as DataGridView;
DataGridViewCell cell = dgv.CurrentCell;
if (cell.IsInEditMode)
{
//限制單元格只能輸入test 
if (cell.EditedFormattedValue != null && cell.EditedFormattedValue.ToString() != "test")
{
MessageBox.Show("輸入內容不合格");
}
else
{
dgv.CurrentCell = dgv[cell.ColumnIndex, cell.RowIndex + 1];
}
}
}
}

當然為了保證使用者直接將滑鼠移動到新的單元格也能做資料的核對,我們還需要新增對這個控制元件的CellEndEdit事件的處理:
private void myDataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
DataGridView dgv = sender as DataGridView;
DataGridViewCell cell = dgv[e.ColumnIndex, e.RowIndex];
{
//限制單元格只能輸入test 
if (cell.EditedFormattedValue != null && cell.EditedFormattedValue.ToString() != "test")
{
MessageBox.Show("輸入內容不合格");

dgv.CurrentCell = cell ;
}
else
{
dgv.CurrentCell = dgv[cell.ColumnIndex, cell.RowIndex + 1];
}
}
}

這樣無論是使用者按的Enter鍵還是直接移動滑鼠就都會做相應的驗證了。
為了使得程式碼便於維護最好將判斷校驗程式碼單獨寫到一個方法,供這個兩個事件處理呼叫。

轉載自:http://hi.baidu.com/topkaze/item/40e83c0c46dc7519acdc701f