同步滚动两个DataGrid

     拿到这个首先想到的就是重写Scroll方法,可是想想工作量有些大,所以想在Form级别上做做手脚,看看DataGrid的成员列表可以看到这样两个保护性的方法:
GridHScrolled              Listens for the horizontal scrollbar's scroll event.  
GridVScrolled                   Listens for the vertical scrollbar's scroll event.

要得就是它。好了那现在就开始些我们自己的DataGrid吧。首先需要创建一个解决方案,其中有两个工程,一个Windows控件库项目和WinForm项目,前者是我们的写的DataGrid控件后者则是测试控件的工程。创建Windows用户空间会有一个默认的类,删了或者修改他的名字为crlDataGrid(你自己随便叫好了)。我们修改它的继承关系,让他从DataGrid继承。如下所示:
public class CrlDataGrid : System.Windows.Forms.DataGrid。
这样我们就可以用我们自己的DataGrid公开上面提到的两个方法了。如下所示:
public void crlGridVScrolled(object sender,ScrollEventArgs e){

       this.GridVScrolled(sender,e);

    }

    public void crlGridHScrolled(object sender,ScrollEventArgs e){

       this.GridHScrolled(sender,e);

}
到此,我们的控件就完成了。其实很简单就是公开了那两个原来隐藏的方法。
接下来就是测试项目:我们新建一个WinForm工程。首先我们需要引用我们自己的DataGrid控件,方法如下:在工具箱里使用鼠标右键选择添加/移除项,使用浏览找到我们刚才工程所在目录下面的dll之后添加到工具箱里。用如下的方法把数据绑定到我们自定义个DataGrid上面:
SqlConnection conn = new SqlConnection("server=(local);database=northwind;uid=sa;pwd=;");
        SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Orders",conn);
        DataSet ds = new DataSet();
        da.Fill(ds);
        this. grdSource.DataSource = ds.Tables[0].DefaultView;
        this. grdAim.DataSource = ds.Tables[0].DefaultView;
其中grdSource和grdAim是两个自定义DataGrid,我们要做的就是当第一个DataGrid(grdSource)滚动的时候第二个也以相同的方式滚动。
  private CrlDataGrid.CrlDataGrid grdSource;
  private CrlDataGrid.CrlDataGrid grdAim;
下面我们要做的是实现垂直方向的同步我们申明两个VscrollBar对象,为了也可以横向的拖动,我们还声明两个水平的滚动条对象。     VScrollBar m_SourceVScroll;
VScrollBar m_AimVScroll;
HScrollBar m_AimHScroll;
 HScrollBar m_SourceHScroll;
我们将在两个自定义DataGrid中找到他们对应的滚动条对象,同时给这些滚动条的事件压入堆中,同时为他们添加事件处理程序,代码如下:
     public void addEventHandler(){
     foreach(Control ctrl in this.grdSource.Controls){
     if(ctrl.GetType().Name == "VScrollBar"){
     this.m_SourceVScroll = (VScrollBar)ctrl;
     break;
 }
 }
foreach(Control ctrl in this.grdAim.Controls){
 if(ctrl.GetType().Name == "VScrollBar"){
this.m_AimVScroll = (VScrollBar)ctrl;
break;
}
}
 this.m_SourceVScroll.Scroll +=new ScrollEventHandler(m_SourceVScroll_Scroll);
 this.m_AimVScroll.Scroll +=new ScrollEventHandler(m_AimVScroll_Scroll);

  //================== 添加水平 ======================

        

ExpandedBlockStart.gifContractedBlock.gifforeach(Control ctrl in this.grdSource.Controls)dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif
if(ctrl.GetType().Name == "HScrollBar")dot.gif{
InBlock.gif 
this.m_SourceHScroll = (HScrollBar)ctrl;
InBlock.gif 
break;
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedBlockEnd.gif         }

ExpandedBlockStart.gifContractedBlock.gif
foreach(Control ctrl in this.grdAim.Controls)dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif
if(ctrl.GetType().Name == "HScrollBar")dot.gif{
InBlock.gif
this.m_AimHScroll = (HScrollBar)ctrl;
InBlock.gif
break;
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
ExpandedBlockEnd.gif         }

None.gif
this.m_AimHScroll.Scroll +=new ScrollEventHandler(m_AimHScroll_Scroll);
None.gif
this.m_SourceHScroll.Scroll +=new ScrollEventHandler(m_SourceHScroll_Scroll);
None.gif}
None.gif
None.gif

 接下来我们要在构造函数中调用这个方法如下所示:

public Form1(){

               InitializeComponent();
               this.addEventHandler();
 }
最后就是添加事件处理函数如下所示:
  private void m_SourceVScroll_Scroll(object sender, ScrollEventArgs e) {
  this.m_AimVScroll.Value = this.m_SourceVScroll.Value;
  this.grdAim.crlGridVScrolled(sender,e);
 }

  private void m_AimVScroll_Scroll(object sender, ScrollEventArgs e) {

           this.m_SourceVScroll.Value = this.m_AimVScroll.Value;

           this.grdSource.crlGridVScrolled(sender,e);

       }

 

       private void m_AimHScroll_Scroll(object sender, ScrollEventArgs e) {

           this.m_SourceHScroll.Value = this.m_AimHScroll.Value;

           this.grdSource.crlGridHScrolled(sender,e);

       }

 

       private void m_SourceHScroll_Scroll(object sender, ScrollEventArgs e) {

           this.m_AimHScroll.Value = this.m_SourceHScroll.Value;

           this.grdAim.crlGridHScrolled(sender,e);

 

       }
上面分别是水平滚动和垂直滚动的事件处理程序。到此为止这种两个DataGrid的同步就完成了,编译运行可以通过同时也达到了预期的目的!

转载于:https://www.cnblogs.com/jigee/archive/2006/05/13/399266.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RISC-V踩坑记----__builtin_clz((x)库函数的应用

RISC-V的确是个好东西,可是,免费的东西往往需要付出代价才能得到了,最近遇到了一个算法中的问题,追了好久,最终追到了这个库函数中,没想到,这个库函数居然还隐藏着一些猫腻。值得记下来啊。 首先…

整蛊偷快递的家伙!不愧是 NASA 工程师

分享个有意思的新闻给大家,一笑之余,也可以学习下文中主角的理工科思维。不知道你有木有过。。快递包裹被别人偷走的经历??包裹历经波折终于到了家门口,结果。。却被人给顺走了!!报警&#xff1…

dns 320 linux,linux 下 dns服务器(三 配置篇)

如何设置一个caching only域名服务器1 设置所谓caching only域名服务器是指一个服务器运行有n a m e d进程,但是并不对任何域(区)的域名信息具有授权,也就是并不向外提供本域的域名匹配信息,不负责I n t e r n e t上对本组织域名解析的应答&…

图解Cisco Packet Tracert之利用TFTP来升级路由器的IOS

对于我们这些学生来说,如果是自学的朋友来说,想摸到真机那实在是太难了,说去买一台呢?买来又没有多大作用,利用dynamips来模拟呢,他本来就是加载的IOS,在flash里面又没有IOS,这时候那…

终于用上gcc-4.1编译的系统了

终于用上gcc-4.1编译的系统了 把PHP、APACHE2、MYSQL又配好了。数据还是原来的数据。posted on 2006-05-19 07:35 浙林龙哥 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/huqingyu/archive/2006/05/19/403972.html

Android中的动画有哪几类?各自的特点和区别是什么?

在 android.view.animation包中有四种基本的动画 ,透明/伸缩/移动/旋转。动画类型Android的animation由四种类型组成XML中alpha渐变透明度动画效果scale渐变尺寸伸缩动画效果translate画面转换位置移动动画效果rotate画面转移旋转…

不指导,一起学习

不敢说指导,只能说以自己的观点来说下这个事情。年前的时候,我一个朋友的朋友也想学电子方面的技术,他毕业后做汽修工作,但是没做多久没离职了,之后在工厂上班一段时间,最近两年帮亲戚一起打理一些生意上的…

linux按键检测结束,关于Linux下按键的检测

写这篇博客是因为自己想做一个fc模拟器,核心代码(6502和ppu的模拟代码)用的原子开发板的代码,人家是从pc向单片机移植,我是反过来了,不过因为写的不错,用函数指针代替了switch方法可以学习一下,so就用了它的…

(翻译)Tricks of the windows game programming Gurus(Windows游戏大师之路) --- 前言(作者:ANDRE LAMOTHE 1999)...

前言:在一篇零编程学习游戏编程的文章文章中提及此书,而且书评很不错,在当时反响很剧烈。因此下了个PDF版的慢慢学习。虽然接触游戏编程很久,玩的五花八门的游戏也有很多,但真正完成的游戏只有一个扫雷游戏。文章中建议…

C语言那年踩过的坑--局部变量,静态变量,全局变量在内存中存放的位置

先看几个概念: 1、bss是英文block started by symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。bss段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户应…

如何阅读3,500万个博客?

博客至今已经出现5年了,目前这股热潮正在愈演愈烈。博客又叫网络日志,现在已经非常普及;跟踪3,500多万个博客的Technorati Inc.称,博客的总数量每6个月就增加一倍。这就带来了一个问题:如何从浩如烟海的信息中找到想要…

u-boot与bootloader及其区别

Bootloader比Bootloader从字面上来看就是启动加载的意思。用过电脑的都知道,windows开机时会首先加载bios,然后是系统内核,最后启动完毕。那么bootloader就相当于手机的bios,它在手机启动的时候根据基带初始化硬件,然后…

assets目录与res/raw目录下文件的区别

assets目录与res/raw目录下文件的区别 assets目录下的文件不会被编译成二进制,直接被打包到apk中。 assets目录中的文件不会在R.Java中建立索引。 assets目录下的文件需借助AssetManager访问。 assets目录下可以建立自己的子目录。 res/raw目录下的文件会被编译成二…

linux gdb 忽略信号,linux gdb调试基本命令

近年来,随着嵌入式技术飞速发展,嵌入式产品随处可见,Linux的应用也越来越广泛。接下来是小编为大家收集的linux gdb调试基本命令,希望能帮到大家。linux gdb调试基本命令1.启动调试前置条件:编译生成执行码时带上 -g,如果使用Makefile&#x…

Adobe Dreamweaver 添加库、标签和属性

您可以在 Dreamweaver 中使用标签库编辑器添加标签库,并将标签和属性添加到标签库中。 添加一个标签库在标签库编辑器(“编辑”>“标签库”)中,单击加号 () 按钮,然后选择“新建标签库”。在“库名称”框中&#xf…

白话debounce和throttle

遇到的问题 在开发过程中会遇到频率很高的事件或者连续的事件,如果不进行性能的优化,就可能会出现页面卡顿的现象,比如: 鼠标事件:mousemove(拖曳)/mouseover(划过)/mouseWheel(滚屏)键盘事件:keypress(基于…

Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案)

Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案) Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案) 目前网上找到的Subversion的配置说明中,关于用户权限控制…

wireshark抓包工具的使用及分析

前段时间看到群里在讨论Wireshark抓包工具,想写一篇使用笔记但一直没来得及写,本篇就通过实例来分享wireshark抓包工具的使用。Wireshark简介 Wireshark 是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详…

EventLoop笔记

node环境 Event Loop各阶段: - timers 阶段:这个阶段执行 setTimeout 和 setInterval 的回调函数。- I/O callbacks 阶段:不在 timers 阶段、close callbacks 阶段和 check 阶段这三个阶段执行的回调,都由此阶段负责&#xff0c…

如何实现android和服务器长连接呢?推送消息的原理

转载地址:http://blog.csdn.net/q376420785/article/details/8653958 前言:现在的大多数移动端应用都有实时得到消息的能力,简单来说,有发送消息的主动权和接受消息的被动权。例如:微信,QQ,天气…