问题:
今天在项目时遇到一个问题,将DataTable绑定到DataGridView,其中一列为CheckBox列,当我修改该列值时,触发CellValueChanged事件。当我在此事件中处理它的DataSource时,发现该单元格对应的DataTable的值尽管已经改变,但是它的RowState属于Modified。
当我用DataTable.Select()查询相关数据时,该单元格值竟然还是引用老数据。尽管尝试设置DataViewRowState来查询,结果也是无效(此处可能有我不知道的内容,照理说应该能实现)。
于是采用另外的办法,就是调用DataTable.AcceptChanges()接收数据改变。这时候就能得到正确的查询值。
但是这样做,又产生了另外一个问题,那就是AcceptChanges之后应该是重新将数据绑定了一次,导致DataGridView中的滚动条位置移动了。
于是接着便需要让滚动条位置不变。
解决:
DataGridView虽然有VerticalScrollBar属性, 但却是受保护的对象, 无法外部访问, 看了一下DataGridView的各项属性, 发现FirstDisplayedScrollingRowIndex就是滚动条的Value, DataGridView的行高乘以FirstDisplayedScrollingRowIndex就是客户区高度
于是在AcceptChanges之前记录该值,然后之后再还原该值就可实现。
int r = DataGridView.FirstDisplayedScrollingRowIndex;// r是datagridview的索引值,相当于datagridview.selected[rows].index DataTable.AcceptChanges(); DataGridView.FirstDisplayedScrollingRowIndex = r;
时间: 2024-10-08 06:27:55