我的代码大致是这样的(省掉一些细节):        private void dgv1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            if (!dirtyRow) return;            try
            {
                    //将该行所有单元格数据写入数据库...(省略代码)
            }
            catch (Exception ex) 
            {
               //如果写不进去,肯定是上面某个单元格数据有错
                ShowPop(ex.Message, e.RowIndex);
                dirtyRow = false;
                return;
             }
             //执行完以上代码之后,紧接着发生了我单击的下一行单元格的Cell_Enter事件,于是光标还是跑到下一行去了.
        }        void ShowPop(string msg, int r)
        {
            string key = "";
            //根据msg找出错误单元格所在列的名称key...(省略代码)
            MessageBox.Show(msg);
            if (key != "")
            {
                //将光标定位到错误单元格
                dgv1.CurrentCell = dgv1.Rows[r].Cells[key];
                dgv1.BeginEdit(false);
            }
        }
我相信这个问题应该比较简单,只是我思想现在一直转不过弯来了!

解决方案 »

  1.   

    cellValidating是不现实的,因为不可能用户每写一个单元格就存一次数据库. 写满一行存一次是底线了. 再说即使单元格有验证,也不能保证都能进库.
      

  2.   

    cellValidating里不要写娄据库,写入到内存中,在适当的时间一次性写入数据库,这样对性能也有好处
      

  3.   

    你可以尝试重写一下datagridview按如下思路
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
            { 
                if (keyData == Keys.Enter) 
                { 
    //你要做的事 
                    return true; 
                } 
                else 
                { 
                    return base.ProcessCmdKey(ref msg, keyData); 
                } 
            } 让他换列不换行
      

  4.   

    有些数据的错误是你无法预料的。我们不可能编写一个面面俱到的错误检查程序(即使能编,我也没那么勤快),所以有时候还要要靠写库来让数据库帮你查错。 一行提交一次在感觉上不会对性能有太大的影响(sql企业管理器不就是这么做的吗)
      

  5.   

    不要用RETURN,用e.Cancel = true;