vs2005+ActiveReportsNet2
承接上節,最終出來的效果是這樣的(見圖),可以看出布局不能滿足我們平時帳票的要求,至少各個TextBox之間不能有間距吧?
<!--[endif]-->
希望有的效果:
最簡單的方法,當然是直接在rpt界面上拖動控件,把布局弄好就可以了,這對於簡單的報表當然沒有問題。需要布局的有:textbox等控件,pageHeader/footer,GroupHeader/Footer,Detail等。
不過這樣會有很多問題:
(1),首先,比較容易誤操作,尤其是在一些比較精密的帳票中,用戶是不會允許哪怕1毫米的誤差。
(2),還有,假如直接在rpx上布局的話,會把模版弄的很緊湊,幾個控件比較難區分,假如我用代碼來布局的話,模版上的布局就只需要大致有個樣子,看起來清楚多了。
(3),更重要的是如果有子模版的情況下。SubReport的寬度是很難確定的。主模版上的SubReport的控件寬度應該是和它對應的子模版(subX.rpx)的寬度相等的,但你在畫主模版的時候,是確定不了子模版的寬度的(子模版可能會分欄,但ColumnCount我們有時候是不能確定的,要根據傳入的數據源確定的)
在我們的項目中,一般要求在代碼中控制布局(除了一些特殊的特注帳票)。
1,ok,下面就說說用代碼控制布局的具體方法:(字數比較多,可以結合步驟2的代碼來看)
(1),創建各個主/子模版,把上面的控件大致布局好(恩,裝個樣子就可以了)
先處理子模版。無子模版直接到(7)。
(2),設置子模版上所有控件的寬度。見注1。
(3),對子模版上的所有控件排位置。
(4),設置子模版的groupHeader/groupFooter,detail(包括height,detail的columnCount)(用於布局),以及PrintWidth(用於打印出實際的寬度)
(5),子模版創建一個ReadOnly Property ReportWidth(該屬性return的就是該模版具體要打印出來的寬度,比如sub1.rpx的寬度是2個textbox的總寬度;sub2.rpx的寬度是txtScore的寬度)。
這裡也可以把分欄考慮進去,這樣的話,sub1的寬度就是2個textbox寬度*1;sub2的寬度就是txtScore.width*2。
考慮分欄的話,需要注意的是,我們舉例的這張帳票,page1的sub2只有1列,而page2卻有2列,所以寬度不能簡單的用txtScore.widh*2。最好這裡不考慮分欄,而把分欄放到主模版裡的GroupHeader1_Format事件中處理。(不過我們項目中每頁的分欄數不同的帳票好像很少有)
本例在sub report的reportwidth中沒有考慮分欄。
(6),子模版如果分欄,並且欄數不確定(根據用戶的選擇,欄數是動態的)。則創建一個public屬性RealColumnCount,主模版根據數據源,把真正的ColumnCount傳給子模版。
如果字模版分欄,但是是固定的,(比如欄是月份,固定12),大可以把detail的columnCount設死。
處理主模版
(7),在GroupHeader1_format事件中設置子報表。
(8),設置主模版上所有控件的寬度(不包括subReport控件)。見注1。
(9),如果有subreport的話,計算它們的寬度。
1)如果不分欄,寬度就是子模版的ReportWidth
2)如果分欄,但欄數是靜態固定的(比如12),則寬度就是子模版ReportWidth*12
3)如果分欄,欄數是動態的,但每頁都是一樣的(比如A,B 2班,任意門科目的成績, 雖然,科目數目不確定,但每班要麼都顯示3門,要麼都顯示4門)
這種情況,先在ReportStart事件中通過數據源算出columnCount,然後寬度就是子模版ReportWidth*columnCount
4)如果分欄,欄數是動態的,而且每頁都可能不一樣,比如本例,page1只有1列,page2 卻有2列。
這種情況,可以把subReport的寬度放到GroupHeader1_Format事件中去計算,計算方法同3),這樣的話,每頁都會把subReport的寬度重新算一下。
本例的情況屬於4)。一般可以用3)的話,盡量不用4),4)由於每個page都要重繪,效率比較低。
(10),對主模版上的所有控件排位置。(如果subReport是在GroupHeader1_format事件中計算的,則,排位置也要在該事件中處理,並不絕對)
(11),設置主模版的PageHeader/PageFooter,GroupHeader/GroupFooter,Detail。以及整個模版的PrintWidth。
注1:我們項目中對各種用途的控件寬度都有規定的,比如生徒氏名8單位寬度,科目名6單位寬度。具體寬度寫在公共類裡了,到時調用一下就可以了。
本文就略過這步了,textbox和label寬度就直接在畫面上拉。
2,接下去,我們實際來做!
本節的代碼由上節的代碼修改而成,前面的模版、控件創建,數據源准備等都跳過。
直接看看具體子模版和主模版中的代碼(代碼中我會用Setp x來指明對應的具體步驟):
1)Sub1.vb
<!--[endif]-->