本文假定讀者已對Visual Studio 2005 IDE有了初步的了解,並能用C#編寫代碼,懂不懂MS Reporting Services都對理解本文沒有關系,當然了,之前寫過類似的報表,將有助於妳更快地上手。好了,卷起袖子,準備開始吧!
請看圖1,這份報表有多復雜?猜猜它需要多少時間完成?就復雜而言,它只是壹份簡單的、從NorthWind->Products (SQL Server 2000)中提取出來的報表;就時間而言,相信不會花妳壹整個小時吧。
圖1
下面,我們開始創建報表,首先要編寫壹個生成報表的C#小程序。
第壹步:創建壹個Windows應用程序
選擇文件菜單,新建-工程,從工程類型中選擇C#,從右方對話框中選擇Windows應用程序;在名稱欄中,最好用壹個表明程序用途的名字;在位置欄中,寫明妳想要保存的目錄。完成之後,工程中會有壹個Form1,我們就從對它的窗體設計器開始講解。
像下面這樣修改Form1的屬性,當然也可以依個人喜好修改其他的屬性:
Form1.Text = "MS Reporting Services 101 with Smart Client"
Form1.Size = 750, 300
第二步:為窗體(Form)添加報表查看器(Report Viewer)
什麽是報表查看器,就像看DVD碟時需要壹部DVD播放機壹樣,我們需要壹個報表查看器來預覽報表。
對初寫報表的人來說,報表查看器可以說是賦予了報表生命,它不僅可預覽輸出,還可幫助將報表信息生成各種格式(PDF或Excel等等),打印出來更不在話下。
[span] 請按如下步驟在Form1上放置好報表查看器控件:
依次找到工具箱(ToolBox)-數據(Data)-報表查看器(ReportViewer),並把它拖到Form1上。這會創建壹個名為reportViewer1新的實例。
通過設置reportViewer1.Dock = Fill,報表查看器將會填充窗體的整個區域,以顯示報表。
在完成第壹步與第二步之後,工程看起來應該如圖2所示:
圖2
第三步:為工程添加數據集(DataSet)
數據集是伴隨報表查看器而來的,它保存並提供從數據源而來的原始數據,我們便可對這些原始數據進行處理或在C#程序中輸出。
請依照如下步驟添加數據集:
從解決方案資源瀏覽器中選擇添加-新項目-數據集,將其名稱DataSet1修改dsProduct,並單擊添加按鈕完成。
添加壹個數據表到新創建的數據集中。數據表實質上是用來加載報表數據的,在設計報表時,將會用到DataSet/DataTable中的相關信息。
以下為添加數據表到數據集(dsProduct)中:
從解決方案資源瀏覽器中雙擊dsProduct,將會打開設計視圖,右鍵單擊並選擇添加-數據表。接著,單擊表頭修改名稱為dtProductList,如圖3:
圖3
接下來開始為數據表(dtProductList)添加列,此時的設計視圖應該如圖4所示。右鍵單擊dtProductList並選擇添加——列(Column)。
圖4
重復以上步驟添加以下列:
ProductName (String)
QuantityPerUnit (String)
UnitPrice (Double)
UnitsInStock (Double)
UnitValue (Double):壹個基於UnitsInStock * UnitPrice的計算域
在添加列時,默認為String數據類型,添加完之後請轉到屬性窗口,修改相應的列為Double類型。
請看圖5,現在的數據表看上去應該就像這樣子了。同時,妳也可查看屬性窗口來修改數據類型。
圖5
第四步:為工程添加報表
到目前為止,我們已經創建了工程,添加了報表查看器與數據集;現在,是時候創建壹份整潔、優美的報表了。
需按照以下步驟生成報表(rptProductList.rdlc):
從解決方案資源瀏覽器中選擇添加-新項目-報表,把名稱Report1.rdlc修改為rptProductList.rdlc,並單擊添加按鈕完成。
工程可能會像圖6這樣;而添加完報表之後,就可以開始使用數據集(DataSet)進行設計了。
圖6
無論妳是第壹次設計報表的新手,或是歷經沙場老手,都必須與以下三種最基本的報表區域打交道:頁眉(或叫表頭)、頁腳、表體。壹般來說,報表在設計時,就應該有壹個腹稿,如多大的紙張、應該怎樣排版等等,通常都為信紙大小、縱向排版。當然了,如果能在動手之前,先在紙上畫個草圖,這樣更好。可以回過頭來看壹下圖1,在頁眉,已經有了報表名及報表日期,表體中有產品的相關信息列表,而頁腳中有頁碼。
那我們就從頁眉開始吧。當添加新報表到工程時,默認情況下,在報表設計器中只能看到表體。右鍵單擊報表設計器的表體之外處,選擇頁眉,這會在報表中添加壹個頁眉,可以隨意調整頁眉與表體區的高度,請看圖7,圖7中減少了表體的高度,增加了頁眉的高度。
圖7
在報表設計器的工具箱中,妳可以看到用於設計報表的各種各樣的控件。在我們這個例子中,會用到TextBox、Line和Table控件。現在我們開始設計頁眉了。拖動兩個TextBox並把它們置於頁眉區,TextBox既能顯示靜態也能顯示動態的數據,而Line控件用於把頁眉從表體區中分隔出來。控件放置好之後,可以修改它們的屬性以顯示我們所需的值,例如可以指定壹個TextBox為報表標題,而另壹個TextBox顯示當前日期。選擇TextBox之後,可直接在其內輸入靜態文本。
請照以下修改標題TextBox:
Value = "Product List"
Color = Purple
而日期TextBox則修改為:
Value = "Run Data: " & Today
Color = Purple
[span] 要註意了,日期TextBox的Value屬性以"="符號打頭,這代表它不是壹個簡單的靜態文本,而是壹個表達式,這個表達式是字符串"Run Date"與VB.NET腳本Today的結果。
另外多說壹點,妳可對報表中所有對象指定任何妳想要的名稱,壹般對大多數控件而言,保持默認名稱就好了,此處把標題TextBox的名稱(即Name屬性)指定為“txtTitle”。
參照圖8,完成頁眉設計之後,應該看起來就像這樣子:
圖8
現在是表體了。表體是承載信息的詳細區域,是整個報表最重要的部分,而且妳也看到了,當添加報表到工程時,表體已經自動添加了,我們只需要在上面放些控件就行了。
從傳統意義上來說,表體區是用於顯示詳細數據的(在本例中,為產品信息),並且通常為多行信息,而隨著報表上數據的增多,表體區也相應會擴展,但壹般來說,報表只會設計為壹頁(信紙或A4紙大小)。
在表體區中,有三種最常用的控件:Table、Matrix、List,在本例中會使用Table控件。在報表設計界面中,拖動並把Table控件放置於表體區中,妳會看到,這會生成壹張三行三列的表,而中間壹列則已被標記為:Header、Detail、Footer。
當妳知道Table控件只不過是壹堆TextBox的組合,是不是有點吃驚呢。對了,Talbe中的每個單元(Cell)都與TextBox壹樣,也就是說,可以在其中輸入靜態文本,或指定壹個動態表達式。
在開始設計表體區之前,記得要多添加兩列(我們的報表中有5列喔),添加列非常簡單,依照以下步驟就行了:
1、 在表體區中選擇Table控件。
2、 左鍵單擊最右邊壹列的表頭(此處假設妳是從右邊添加新列的)。
3、 右鍵單擊表頭,並選擇“Insert Column to the Right”(在右邊插入列)。
現在報表看起來應該像圖9了,可以依據列中的數據隨意調整列的寬度。
圖9
大家多半也用過Excel或類似的東西吧,可以把Table控件看成是壹張迷妳工作表,在其中可以選擇邊框類型、改變任壹單元格的字體等等。因此,所需做的就是依之前設想好的格式來設計表格。
我們從第壹列開始,隨後的每壹列也壹樣,單擊最上方的單元格並依次輸入:
表頭1:“Product Name”
表頭2:“Packaging”
表頭3:“Unit Price”
表頭4:“Units in Stock”
表頭5:“Stock Value”
而在接下來的詳細數據區(即前面的Detail)中,需要輸入表達式,其為dsProduct.dtProductInfo中的列,在此既可以手工輸入表達式,也可以從數據源(Data Sources)工具箱(見圖7左邊)中拖放實現。
如果想要手工輸入,請從數據區的第壹列至最後壹列,單擊單元格並輸入:
Detail 1: "=Fields!ProductName.Value"
Detail 2: "=Fields!QuantityPerUnit.Value"
Detail 3: "=Fields!UnitsInStock.Value"
Detail 4: "=Fields!UnitPrice.Value"
Detail 5: "=Fields!UnitsInStock.Value * Fields!UnitPrice.Value"
請留意Detail 5,它是壹個對Units in Stock與Unit Value相乘計算之後的輸出。另外提醒壹點,如果是拖動列到Table控件中的數據區來實現的,此時如果表頭為空,它會自動添加表頭。
最後,在Table控件的頁腳添加壹累計欄,選擇表體區第4與第5列的頁腳單元格,輸入:
單元格4:“Total Value:”
單元格5:"=SUM(Fields!UnitsInStock.Value * Fields!UnitPrice.Value)"
單擊單元格5,這是使用了壹個內置的SUM()函數來得到累計的結果。
最後只剩下頁腳區了,在開始編寫壹些C#代碼之前,還需完成報表的頁腳,正如前面添加報表頁眉壹樣,在打開的報表設計器中,右鍵單擊並選擇頁腳(Page Footer),見圖7。
拖動壹個Line和TextBox控件置於頁腳區,並在TextBox中輸入以下表達式:
Value: ="Page: " & Globals!PageNumber & "/" & Globals!TotalPages
大家可以看到,此處使用了PageNumber和TotalPages,兩 者皆為全局變量。
現在,報表應該像圖10這樣了,此處,還改變了壹點顏色,把數值類數據右對齊,把Table當作壹張Excel工作表好了,可以隨意調整為妳想要的外觀。
圖10
快大功告成了!剩下的就是表達式生成器了。表達式生成器是Reporting Services中壹個非常強大的工具,正如圖11中所見,Stock Value是通過SUM函數計算得到的,DateSet中的所有數據都可以由“Fields!”關鍵字訪問。
圖11
第五步:編寫賦予報表生機的C#代碼
從解決方案資源瀏覽器中,選擇Form1,右鍵單擊並選擇查看代碼,為Form1_Load添加以下代碼:
using System.Data.SqlClient;
using Microsoft.Reporting.WinForms;
private void Form1_Load(object sender, EventArgs e)
{
//聲明連接字符串
string cnString = @"(local); Initial Catalog=northwind;"+"User Id=northwind;Password=northwind";
//如果使用標準安全屬性,請改為以下代碼
//string cnString = @"Data Source=(local);Initial Catalog=northwind; Integrated Security=SSPI";
//聲明連接、命令對象及其他相關對象
SqlConnection conReport = new SqlConnection(cnString);
SqlCommand cmdReport = new SqlCommand();
SqlDataReader drReport;
DataSet dsReport = new dsProduct();
try
{
//打開連接
conReport.Open();
//準備連接對象以把獲取的數據放入數據集
cmdReport.CommandType = CommandType.Text;
cmdReport.Connection = conReport;
cmdReport.CommandText = "Select TOP 5 * FROM Products Order By ProductName";
//從命令對象中讀取數據
drReport = cmdReport.ExecuteReader();
//有了ADO.NET,可把讀取來的數據直接加載到數據集中
dsReport.Tables[0].Load(drReport);
//關閉讀取及連接
drReport.Close();
conReport.Close();
//為查看器提供本地報表數據
rpvAbraKaDabra.LocalReport.ReportEmbeddedResource =
"rsWin101.rptProductList.rdlc";
//準備報表數據源
ReportDataSource rds = new ReportDataSource();
rds.Name = "dsProduct_dtProductList";
rds.Value = dsReport.Tables[0];
rpvAbraKaDabra.LocalReport.DataSources.Add(rds);
//加載報表查看器
rpvAbraKaDabra.RefreshReport();
}
catch (Exception ex)
{
//顯示錯誤信息
MessageBox.Show(ex.Message);
}
finally
{
//檢查連接是否仍然打開,如果是,關閉它。
if (conReport.State == ConnectionState.Open)
{
conReport.Close();
}
}
}
看到這,大家可能會想,為什麽在select查詢語句中使用了“TOP 5”,此處只是作演示的目的,對輸出作壹限制,以得到如圖1中的累計結果。另外,ReportDataSource的Name屬性應總為“DataSet_DataTable”。
湖北新藍海是壹家專註於網絡營銷 網絡推廣的領頭企業 ,已為武漢健民、華工激光、江西仁和等多家知名企業提供網絡營銷外包服務。詳情請到各大搜索引擎中搜索“湖北新藍海”