zoukankan      html  css  js  c++  java
  • 【技巧】DataGridView重新绑定时保持上次滚动位置(SamWang)

    问题:

      今天在项目时遇到一个问题,将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;
       DataTable.AcceptChanges();          
       this.pnl.dgvMain.FirstDisplayedScrollingRowIndex = r;

    作者:SamWang
    出处:http://wangshenhe.cnblogs.com/
    本文版权归作者和博客园共有,欢迎围观转载。转载时请您务必在文章明显位置给出原文链接,谢谢您的合作。

  • 相关阅读:
    导航属性
    提笔忘字
    JavaScript学习总结(一)——闭包、对象、函数
    CSS3新特性(阴影、动画、渐变)
    图片轮播(也可以通过点击下标播放对应的图片)
    CSS3与页面布局学习总结——多种页面布局
    多种居中方法
    二级菜单
    无间隙轮播图片
    模块和程序处理
  • 原文地址:https://www.cnblogs.com/wangshenhe/p/2503630.html
Copyright © 2011-2022 走看看