C#中DataGridView绑定了DataTable后,通过代码修改DataGridView中的数据,总有一行(被修改过并被用户选中的行集合中索引为0的行)不能被UpDate回数据库的问题和解决办法
来源:互联网 发布:linux如何退出vi 编辑:程序博客网 时间:2024/06/07 01:22
问题细节:
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。
- C#中DataGridView绑定了DataTable后,通过代码修改DataGridView中的数据,总有一行(被修改过并被用户选中的行集合中索引为0的行)不能被UpDate回数据库的问题和解决办法
- 获取DataGridView中被选中的行
- c#中dataGridView数据绑定后的数据操作
- C#中DataGridView控件鼠标点击选中行的问题
- C#中通过DoDragDrop来拖动datagridView中的选中的行
- C#中DataGridView控件的数据绑定
- C#中将DataGridView中查询出来的数据使用DataTable导出为Excel表格(通过NPOI)
- DataGridView中comboBox数据绑定的问题
- DataGridview中DataGridViewComboBoxColumn数据绑定的问题
- DataGridView中comboBox数据绑定的问题
- C#勾选dataGridView中的CheckBox(可以多选)并把有修改的CheckBox值(1或者0)更新到数据库表A.列B中!
- 获取DataGridView中checkBox选中的多行数据并将选中的行插入数据库
- 直接在DataGridView中添加修改数据的问题
- C#Winform删除DataGridView中被选中的行
- 在DataGridView中修改后的数据如何保存到数据库
- C#编码中,打印预览DataGridView的一段代码,稍作了修改,可以实现。
- C#的DataGridView中,如何选中新添加的行
- 用dataGridView实现对数据库数据的修改并显示
- CvPoint2D32f
- dom4j的基本操作
- JAVA中的类型转换
- Function
- HDU 1002 A + B Problem II
- C#中DataGridView绑定了DataTable后,通过代码修改DataGridView中的数据,总有一行(被修改过并被用户选中的行集合中索引为0的行)不能被UpDate回数据库的问题和解决办法
- 有些错误就只因没有全局观
- CvPoint3D32f
- MapObject shape数据操作 一
- CvSize
- 今天注册了博客
- linux下创建和删除软、硬链接
- CvSize2D32f
- VMware 9 安装 OS X 10.8.4 并安装 Xcode 4.6