同步滚动两个DataGrid
GridHScrolled??????????????Listens for the horizontal scrollbar's scroll event.??
GridVScrolled???????????????????Listens for the vertical scrollbar's scroll event.
要得就是它。好了那現(xiàn)在就開始些我們自己的DataGrid吧。首先需要創(chuàng)建一個解決方案,其中有兩個工程,一個Windows控件庫項目和WinForm項目,前者是我們的寫的DataGrid控件后者則是測試控件的工程。創(chuàng)建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之后添加到工具箱里。用如下的方法把數(shù)據(jù)綁定到我們自定義個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,我們要做的就是當?shù)谝粋€DataGrid(grdSource)滾動的時候第二個也以相同的方式滾動。
? private CrlDataGrid.CrlDataGrid grdSource;
? private CrlDataGrid.CrlDataGrid grdAim;
下面我們要做的是實現(xiàn)垂直方向的同步我們申明兩個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);
??//================== 添加水平 ======================
????????
foreach(Control?ctrl?in?this.grdSource.Controls){if(ctrl.GetType().Name?==?"HScrollBar"){
?this.m_SourceHScroll?=?(HScrollBar)ctrl;
?break;
????????}
?????????}
foreach(Control?ctrl?in?this.grdAim.Controls){
if(ctrl.GetType().Name?==?"HScrollBar"){
this.m_AimHScroll?=?(HScrollBar)ctrl;
break;
?????????}
?????????}
this.m_AimHScroll.Scroll?+=new?ScrollEventHandler(m_AimHScroll_Scroll);
this.m_SourceHScroll.Scroll?+=new?ScrollEventHandler(m_SourceHScroll_Scroll);
}
?接下來我們要在構造函數(shù)中調用這個方法如下所示:
public Form1(){
?????????????? InitializeComponent();
?????????????? this.addEventHandler();
?}
最后就是添加事件處理函數(shù)如下所示:
? 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
總結
以上是生活随笔為你收集整理的同步滚动两个DataGrid的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原来做的一个语义搜索软件的界面
- 下一篇: 我的学习工作经历,一个园林专业中专毕业生