日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

同步滚动两个DataGrid

發(fā)布時間:2023/12/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 同步滚动两个DataGrid 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
???? 拿到這個首先想到的就是重寫Scroll方法,可是想想工作量有些大,所以想在Form級別上做做手腳,看看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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。