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

    (1)DataGridView

      今天在项目时遇到一个问题,将DataTable绑定到DataGridView,其中一列为CheckBox列,当我修改该列值时,触发CellValueChanged事件。当我在此事件中处理它的DataSource时,发现该单元格对应的DataTable的值尽管已经改变,但是它的RowState属于Modified。

      当我用DataTable.Select()查询相关数据时,该单元格值竟然还是引用老数据。尽管尝试设置DataViewRowState来查询,结果也是无效(此处可能有我不知道的内容,照理说应该能实现)。

      于是采用另外的办法,就是调用DataTable.AcceptChanges()接收数据改变。这时候就能得到正确的查询值。  

      但是这样做,又产生了另外一个问题,那就是AcceptChanges之后应该是重新将数据绑定了一次,导致DataGridView中的滚动条位置移动了。

      于是接着便需要让滚动条位置不变。

    解决:

       int r = DataGridView.FirstDisplayedScrollingRowIndex;//   r是datagridview的索引值,相当于datagridview.selected[rows].index
    DataTable.AcceptChanges(); DataGridView.FirstDisplayedScrollingRowIndex = r;

      DataGridView虽然有VerticalScrollBar属性, 但却是受保护的对象, 无法外部访问, 看了一下DataGridView的各项属性, 发现FirstDisplayedScrollingRowIndex就是滚动条的Value, DataGridView的行高乘以FirstDisplayedScrollingRowIndex就是客户区高度

      于是在AcceptChanges之前记录该值,然后之后再还原该值就可实现。

    (2)ListView

    1. 记住最后一次点击的id: int id = lv.getSelectedItemPosition();

    2.  Activity:onCreate()  最后加上次语句:lv.setSelection(id);

  • 相关阅读:
    每天一道算法题(13)——使用递归颠倒栈
    每天一道算法题(12)——和为n的连续正数序列或者随机数
    函数模板
    答题总结(1)
    顶点间最短路径长度之探寻算法
    最小生成树
    new与delete,malloc与free
    C++的继承与接口
    笔记13 AOP中After和AfterReturning的区别
    笔记12 注入AspectJ切面
  • 原文地址:https://www.cnblogs.com/zzlp/p/4352823.html
Copyright © 2011-2022 走看看