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。 |