【技巧】DataGridView重新绑定时保持上次滚动位置

问题:

  今天在项目时遇到一个问题,将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

【技巧】DataGridView重新绑定时保持上次滚动位置的相关文章

C# datagridview列绑定类中类的属性

datagridview编辑列时,对于类中类的属性绑定,尝试了一下”类名.属性名“ 并没有正确绑定,后又尝试了几次无果,只能利用Linq来解决了, 首先,datagridview要绑定的是学生类(Student),而学生类里有老师类(Teacher) 1 public class Student 2 { 3 public int Id; 4 public Teacher teacher; 5 } 6 7 public class Teacher 8 { 9 public string Name;

C#.Net 给DataGridView列绑定数据和显示列名的方法

选择DataGridView控件,在属性中选择Colums属性项点击,编辑DataGridView控件的列,可以通过列编辑器添加多个列项,其中列属性的中HeadText是对外显示的,即向用户呈现的,Name是用于命名列对象的,而DataPropertyName是用于指定你将数据源的那一列绑定到该列上的,就是这个列属性可以DataGridView中的列绑定指定的数据,具体只需要将DataPropertyName列属性指定为数据源的某个列名即可,例如:数据源中一列为“UserName”,则将Data

[精通Objective-C]进阶技巧:使用运行时系统API

[精通Objective-C]进阶技巧:使用运行时系统API 参考书籍:<精通Objective-C>[美] Keith Lee 什么是运行时系统? 目录 精通Objective-C进阶技巧使用运行时系统API 目录 动态加载可选包 创建命令行程序 创建可选包 传入包路径 使用可选包 运行时系统API 动态代理 创建实现横切功能的协议和类 编写代理类 添加代理的目标类 测试动态代理程序 动态加载可选包 下面是使用NSbundle API动态加载自己编写的框架包的示例,共需要创建两个工程,一个命

模型绑定时对客户端传过来的数据做处理的几种方式

有时我们从客户端获取来的数据.不一定就是我们先要的,需要做一些处理 .这里我们以一个model的属性需要做处理为例子. 这里说5种解决方法. model: public class MyModel { public string Encrypt { get; set; } public string Lala { get; set; } } Controller: public class HomeController : Controller { public void Test(MyMode

ionic中&lt;ion-scroll&gt;设置为左右滚动,苹果手机端触摸到此标签上时无法上下滚动内容

ionic中<ion-scroll>设置为左右滚动,苹果手机端触摸到此标签上时无法上下滚动内容. 如下代码: <ion-scroll direction="x" scrollbar-x="false" style="width:100%">  <ul class="brand-scrollList"> <li ng-repeat="lists in bestProjects&

js小技巧: 给div绑定keydown事件

要想给一个元素绑定keydown事件我们经常这样: $('#some_thing').keydown(function(event){ ...... }) 但是当你尝试给div元素绑定时会发现不起作用, 解决办法是给这个div添加一个tabindex的属性: $('#some_div').attr('tabindex', 1).keydown(function(event){ ...... }) js小技巧: 给div绑定keydown事件

【Delphi】FMX 如何设置 TVertScrollBox的滚动位置,使其回到顶部原点

在手机APP开发中, 纵向的滚动框非常实用,可以说是必不可少的控件,甚至为了自适应不同手机屏幕大小,使用滚动框是非常方便的懒人方法. 当我们使用TVertScrollBox控件时,发现除了控件内部封装好的自动化的触控滚动,还有一个方法ScrollBy可以调整滚动条位置,但实际中我们发现,ScrollBy是一个增量滚动的方法,即ScrollBy(0,10)代表向上滚动10个像素,FMX中的像素点并不是屏幕的硬件像素点,而是FMX内部的逻辑像素点,通过ScrollBy方法内部源码也可以知道,若需要滚

jQuery页面的滚动位置scrollTop、scrollLeft

Web页面常常比显示该页面的浏览器窗口还要大,因为Web文档具有很多内容,往往会导致页面比浏览器还要高,有时候甚至还要宽,这迫使访问者通过滚动来查看整个页面(如图10-8所示).当访问者滚动页面的时候,一部分文档会从视线中消失.例如,Web页面不能完全放入浏览器窗口中,文档会向左或向上滚动,因此,页面的顶部和左边都会消失在视野之内.这意味着浏览器窗口的左上角和文档的左上角并不相同.如果试图放置一个新元素,例如,屏幕顶部的一个动态Banner:而如果只是试图将元素的left和top位置设置为0,将

“Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置

这个扩展属性从WP8.1就开始用了,主要是为了解决MVVM模式中无法直接控制ListView滚动位置的问题.比如在VM中刷新了数据,需要将View中的ListView滚动到顶部,ListView只有一个ScrollIntoView()方法可以控制滚动的位置,但最好在VM中不要出现直接控制View的代码,需要通过其他的方式. 使用一个扩展属性即可实现: /// <summary> /// 将ListView滚动到顶部 使用方法:在ListView增加扩展属性 /// ext:ListViewSc