void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
 { 
          if (myValidate())  //验证数据是否符合标准
          {  
                   //符合标准则更新到数据库,并会在datagridview上显示更改以后的数据
             //数据库更新操作
           }
           else {
             //不更新数据库
             //在datagridview上显示更改以前的数据
           }
}我的问题是如何现实else中的“在datagridview上显示更改以前的数据”。有没有什么属性之类的包含更改以前的值。希望不要再添加事件,就在CellValueChanged事件中如何处理。
希望高人解答,谢谢。

解决方案 »

  1.   

    获取绑定的行DataRow ,通过DataRow 获取值
    row[columnName, DataRowVersion.Original];如果不是绑定的数据集或数据表,就麻烦了
      

  2.   

    开辟一个表用来记录datagridview数据,符合更改临时表,不符合重新调用临时表的数据更新datagridview
      

  3.   

    接楼上的,如果你用的其他方式来绑定的Datagridview,估计得想想其他相应的办法
      

  4.   

    开辟一个表用来记录datagridview数据,符合更改临时表,不符合重新调用临时表的数据更新datagridview这种方式不太现实,毕竟这个项目中的数据库是不能够随意改动的。
      

  5.   

    你验证输入是否正确可以不在其改变后才做判断,你可以在改变时做判断
    即用事件dataGridView1_CellValidating
    而不是事件dataGridView1_CellValueChanged
      

  6.   

    获取绑定的行DataRow ,通过DataRow 获取值
    row[columnName, DataRowVersion.Original];
    有没有不用获得DataRow的方法。
      

  7.   

    用DataTable.RejectChanges方法。
    if(验证)
    {
    and update to database
    reload data
    Bind DataTable'S AcceptChanges()
    }else
    {
    DataTable.RejectChanges()
    }
      

  8.   

    你在CellValueChanged 事件里是无法获得获得 当前填入的值,和原来的值得。
    当前填入的值叫做FormattedValue。你其实是想对输入的单元格的内容进行验证,最好使用CellValidating事件,这个事件适合你要的验证。在这个事件里获得 刚刚填入的值, e.FormattedValue 并对这个值验证,如果不合法,则调用
     e.Cancel = false; 终止继续设定这个值,并调用
    this.dataGridView1.CancelEdit() 方法来结束编辑模式代码如下:        private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
            {
                object val = e.FormattedValue;
                if (DoMyValidate(val)) //验证数据是否符合标准
                {
                    //验证成功 
                    e.Cancel = false;
                }
                else
                {
                    e.Cancel = true;//失败,中止(不会继续设定值到单元格内)
                    //dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] //获得原来的值                //清除掉刚刚输入的错误的值
                    this.dataGridView1.CancelEdit();//方式1
                    //SendKeys.Send("{ESCAPE}");//方式2
                }        }        //自定义验证
            private bool DoMyValidate(object val)
            {
                if (val is string )
                {
                    int result = default(int);
                    if(int.TryParse(val.ToString(),out result))
                    {
                        return true;
                    }
                }
                return false;
            }
      

  9.   

    谢谢各位。
    在此总结一下大家的答案和我自己的实现方式。大多建议用验证的方式,这种方式是很好,但是不知道加了验证以后会不会影响效率,毕竟我的验证要频繁的访问数据库。再者,不希望通过添加事件来完成。以后这样的开发要借鉴大家的思路。我的实现方式:在读出数据时,在CellValueChanged事件中先直接中数据库读出值,再判断,如果符合要求再更新到数据库。这种方式也要频繁的访问数据,所以效率也不高。我不明白的是:加一个事件和加多个事件在效率上是不是又区别。所以我写在了一个事件里完成验证,而没有用它的验证事件。其实我倾向二楼的方法,虽然没有现实。开始我想有没有和TreeView中一样的方式,TreeView中编辑node的名字以后可以从事件的参数中获得之前的值(e.Node.Text)和现在的值(e.Label),所以我想DataGridView中也应该也相同的参数(后来发现没有)。