Code Snippet
// Define a delegate for BeginInvoke.
public delegate void ChangeCellDelegate(DataGridViewCellEventArgs e);
//Call BeginInvoke in RowEnter and let it finish the job of setting CurrentCell.
private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
{
dataGridView1.BeginInvoke(new ChangeCellDelegate(ChangeCell), e);
}
// Delegate method used for setting CurrentCell.
private void ChangeCell(DataGridViewCellEventArgs e)
{
if (dataGridView1.Rows[e.RowIndex].Cells[2].Value == DBNull.Value)
{
dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[2];
MessageBox.Show(dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString());
dataGridView1.BeginEdit(false);
}
}