void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (myValidate()) //验证数据是否符合标准
{
//符合标准则更新到数据库,并会在datagridview上显示更改以后的数据
//数据库更新操作
}
else {
//不更新数据库
//在datagridview上显示更改以前的数据
}
}我的问题是如何现实else中的“在datagridview上显示更改以前的数据”。有没有什么属性之类的包含更改以前的值。希望不要再添加事件,就在CellValueChanged事件中如何处理。
希望高人解答,谢谢。
{
if (myValidate()) //验证数据是否符合标准
{
//符合标准则更新到数据库,并会在datagridview上显示更改以后的数据
//数据库更新操作
}
else {
//不更新数据库
//在datagridview上显示更改以前的数据
}
}我的问题是如何现实else中的“在datagridview上显示更改以前的数据”。有没有什么属性之类的包含更改以前的值。希望不要再添加事件,就在CellValueChanged事件中如何处理。
希望高人解答,谢谢。
row[columnName, DataRowVersion.Original];如果不是绑定的数据集或数据表,就麻烦了
即用事件dataGridView1_CellValidating
而不是事件dataGridView1_CellValueChanged
row[columnName, DataRowVersion.Original];有没有不用获得DataRow的方法。
if(验证)
{
and update to database
reload data
Bind DataTable'S AcceptChanges()
}else
{
DataTable.RejectChanges()
}
当前填入的值叫做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;
}
在此总结一下大家的答案和我自己的实现方式。大多建议用验证的方式,这种方式是很好,但是不知道加了验证以后会不会影响效率,毕竟我的验证要频繁的访问数据库。再者,不希望通过添加事件来完成。以后这样的开发要借鉴大家的思路。我的实现方式:在读出数据时,在CellValueChanged事件中先直接中数据库读出值,再判断,如果符合要求再更新到数据库。这种方式也要频繁的访问数据,所以效率也不高。我不明白的是:加一个事件和加多个事件在效率上是不是又区别。所以我写在了一个事件里完成验证,而没有用它的验证事件。其实我倾向二楼的方法,虽然没有现实。开始我想有没有和TreeView中一样的方式,TreeView中编辑node的名字以后可以从事件的参数中获得之前的值(e.Node.Text)和现在的值(e.Label),所以我想DataGridView中也应该也相同的参数(后来发现没有)。