C#中用程序代码修改了datagridview中的数据,保存时只对光标当前行有保存解决办法

C#中DataGridView绑定了DataTable后,通过代码修改DataGridView中的数据,总有一行(被修改过并被用户选中的行集合中索引为0的行)不能被UpDate回数据库的问题和解决办法

 长江黄鹤 2017-06-26   |  300阅读  |  1转藏

转藏全屏朗读分享

 问题细节:

DataAdapter的update方法可以接收一个datatable参数
 然后运行下列代码来改变行数据,再去更新数据库的数据

foreach (DataGridViewRow i in dataGridView1.Rows) {
    i.Cells[1].Value = "测试一下啦";
    i.Cells[2].Value = "测试一下啦";
    i.Cells[3].Value = "测试一下啦";
   }
   this.bookTableAdapter.Update(this.scottDataSet.book);
总是被选择的行无法更新!

1、原数据

2、修改他们的内容 假设都改为 "测试一下啦":

通过代码修改:

foreach (DataGridViewRow i in dataGridView1.Rows) {
    i.Cells[1].Value = "测试一下啦";
    i.Cells[2].Value = "测试一下啦";
    i.Cells[3].Value = "测试一下啦";
   }
   this.bookTableAdapter.Update(this.scottDataSet.book);
 

3、关闭软件再次打开查询,发现之前被选择的行并未修改成功,其它行修改成功。

解决:

1、这个问题可以直接用这个方式解决,就是不要通过代码来修改datagridview 而是修改datatable这样就不会有问题。

for(int i=0;i<datatalbe.Rows.Count;i++)

{

    datatable.Rows[i][1]="222";

    datatable.Rows[i][2]="222";

    datatable.Rows[i][3]="222";

}

 

2、这个问题自己做了几小时的测试发现了问题的原因所在:

用上面修改datatalbe的方式是没有问题的,如果你还是要用修改datagridview的方式 就会存在DataRow 的行状态不正确的问题。如果行状态为Unchanged.(未知改变) 则update是无法将这行的数据提交到数据库的。这个问题在于:你是将datatable 绑定到了datagirdview,这样一来 如果在datagridview中某行被选中,则会触发内部事件造成datatable中相应的数据行的状态被置为Unchanged,所以无论你在update前选择了哪行,被选中的那行的状态总是Unchanged,所以不能被update到数据库的!(这里的原因可能是:当datagridview与datatable绑定的时候,编译器会认为datagridview中被选中的行是用户正要编辑的行,所以会触发事件将datatable中相应的行的状态RowState 暂时置为Unchanged,你一但选择了其它行,那么编译器就会自动通过触发相应事件事判断这行是否被用户修改过了,如果修改过则RowState被置为Modify,这时才会被update到数据库中。当然还有几种其它状态 像added deleted)

知道了问题所在,就有办法来解决:

经过试验,无法直接改变行的状态属性,因为它是只读的(但可以通过方法如dt.Rows[i].SetAdded来改变行的状态),也无法通过datagridview.ClearSelection()方法或是其它在代码中直接改变选中行的方式来触发datatable中的行状态的改变。我们可以在update前,通过使用datarow.EndEdit()的方法退出行编辑的方式来达到触发行状态改变的目的(这个方法可以让编译器自动判断行的状态而不用手动去判断设置行状态)。

为了达到无论选择了哪行都能成功地将改变的值update回数据库,可以用循环对datatable中的行执行EndEdit()方法来完美解决这个问题!

如:

for (int i = 0; i < dt.Rows.Count; i++)

                {

                    dt.Rows[i].EndEdit();

                }

这样就没有问题了。

这个问题不知是不是微软的一个小BUG。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值