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);

  • 相关阅读:
    Ajax XMLHttpRequest对象的三个属性以及open和send方法
    去空格
    绑定事件中 如可控制函数的执行次数
    我之理解---计时器setTimeout 和clearTimeout
    关于border边框重叠颜色设置问题
    YbtOj练习:二分5 飞离地球
    YbtOj练习:二分4 分割矩阵
    YbtOj练习:二分3 攻击法坛
    YbtOj练习:贪心3 最优密码
    YbtOj练习:二分2 最小时间
  • 原文地址:https://www.cnblogs.com/zzlp/p/4352823.html
Copyright © 2011-2022 走看看