如何同步滾動兩個相同的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例項化乙個物件的話,那麼這些賦值來,賦值去的物...