如何同步滾動兩個相同的DataGrid

2021-04-13 04:18:49 字數 3158 閱讀 7342

如何同步滾動兩個相同的datagrid

昨天在csdn上看到有人高分(100)問這個問題,不憂心中有些癢癢,仔細看了看問題,其實也是我很久以前就像做的一件事情了,今天剛好是週末回家研究一下,有些收穫,拿出來和大家分享。

問題描述:在winform中如何同步滾動兩個datagrid。

問題分析:拿到這個首先想到的就是重寫scroll方法,可是想想工作量有些大,所以想在form級別上做做手腳,可是屢試不成功(在網上聽說有實現的不過沒有見到)。無奈之下只好看看能不能從datagrid下手,看看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)

public

void crlgridhscrolled(object sender,scrolleventargs e)

到此,我們的控制項就完成了。其實很簡單就是公開了那兩個原來隱藏的方法。

接下來就是測試專案:我們新建乙個winform工程。首先我們需要引用我們自己的datagrid控制項,方法如下:在工具箱裡使用滑鼠右鍵選擇新增/移除項,使用瀏覽找到我們剛才工程所在目錄下面的dll之後新增到工具箱裡。用如下的方法把資料繫結到我們自定義個datagrid上面:

sqlconnection conn = new sqlconnection("server=192.192.192.1;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.grdaim.controls) }

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

foreach(control ctrl in

this.grdaim.controls) }

this.m_aimhscroll.scroll +=new scrolleventhandler(m_aimhscroll_scroll);

this.m_sourcehscroll.scroll +=new scrolleventhandler(m_sourcehscroll_scroll);

} 接下來我們要在建構函式中呼叫這個方法如下所示:

public

form1()

最後就是新增事件處理函式如下所示:

private

void m_sourcevscroll_scroll(object sender, scrolleventargs e)

private

void m_aimvscroll_scroll(object sender, scrolleventargs e)

private

void m_aimhscroll_scroll(object sender, scrolleventargs e)

private

void m_sourcehscroll_scroll(object sender, scrolleventargs e)

上面分別是水平滾動和垂直滾動的事件處理程式。

到此為止這種兩個datagrid的同步就完成了,編譯執行可以通過同時也達到了預期的目的!

如何合併兩個結構相同的DataTable

今天遇到了乙個情況,就是從一張資料表中讀取幾個符合條件1的客戶的資訊,然後再讀取幾個符合條件2的客戶的資訊,最後顯示出來.因為前後兩次資料的客戶資訊的結構是完全相同的,所以乾脆合併成乙個datatable再賦值給gridview好了.寫了個函式.合併兩個相同的datatable,返回合併後的結果 p...

如何對比兩個結構相同的內錶內容

report ztest compare it.data git ekpo1 type standard table of ekpo,git ekpo2 type standard table of ekpo.select from ekpo into table git ekpo1 up to 1...

C 如何判斷兩個物件是否相同

在c 中判斷物件相等,這是對引用型別進行判斷,而不是對值型別,如果是對字串,或者是數值進行判斷相等只需要用 運算子就可以了。對兩個物件用 運算子,只能判斷他們兩個在記憶體中的位址是否一樣的。1.對乙個類只例項化一次 向那些賦值來賦值去的引用如果沒有new例項化乙個物件的話,那麼這些賦值來,賦值去的物...