程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ActiveReports工作總結8——用代碼控制布局

ActiveReports工作總結8——用代碼控制布局

編輯:.NET實例教程


vs2005+ActiveReportsNet2



承接上節,最終出來的效果是這樣的(見圖),可以看出布局不能滿足我們平時帳票的要求,至少各個TextBox之間不能有間距吧?

<!--[if !vml]-->
<!--[endif]-->

 

希望有的效果:

<!--[if !vml]--><!--[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

<!--[if !vml]-->
<!--[endif]-->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved