使用ASP.NET 2.0中的ReportViewer控件
作者:Eve Cole
更新時間:2009-07-01 16:43:40
本文翻譯:webabcd
介紹
任何數據驅動型的應用程式都有一個普遍的需求,那就是報表。 但是,在ASP.NET 1.x中並沒有提供我們這個非常重要的特性。 然而很幸運的是,伴隨著.NET 2.0而來的ReportViewer控制項可以滿足你對報表的一些基本需求。 我將會在本文中向你示範如何使用這個控制項。 ReportViewer控制項既可以在web程式中使用,也可以在windows程式中使用。 在這裡,我將只介紹如何在web程式中使用它。
報表範例
我們假設要產生一個如下所示的顧客資訊清單:
上面的報表是一個非常簡單的以國家分組的顧客資訊清單。 報表的資料是從Northwind資料庫的Customers表裡取得的。 預設情況下,它會顯示所有的顧客資訊。 但是,你也可以讓它顯示屬於你指定的某個國家的顧客資訊。
該報表是使用ReportViewer控制項設計的,它可以從強型別的DataSet或自訂的物件集合中取得資料。 在實際的程式開發中,我們傾向於使用3層架構,而資料的取得經常會是從業務層取得的DataSet或一個泛型集合。 在這裡,我打算使用一個泛型集合作為資料來源,而不是強類型的DataSet。
建立類別庫
首先,開啟Visual Studio,然後建立一個名為ReportViewerLib的類別庫專案。 新增一個如下所示的名為Customer的類別:
using System; using System.Data; using System.Configuration; using System.Data.SqlClient; using System.Collections.Generic; namespace ReportViewerLib { public class Customer { public string strCustomerID; public string strCompanyName; public string strContactName; public string strCountry;
public string CustomerID { get { return strCustomerID; } set { strCustomerID = value; } }
public string CompanyName { get { return strCompanyName; } set { strCompanyName= value; } }
public string ContactName { get { return strContactName; } set { strContactName= value; } }
public string Country { get { return strCountry; } set { strCountry= value; } }
public static List |
GetCustomersForCountry(string country) { SqlConnection cnn=new SqlConnection( ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString); SqlCommand cmd=new SqlCommand(); cmd.Connection=cnn; cmd.CommandText="select CustomerID,CompanyName,ContactName,Country from customers where country=@country"; SqlParameter p=new SqlParameter ("@country",country); cmd.Parameters.Add(p); cnn.Open(); SqlDataReader reader = cmd.ExecuteReader(); List |
(); while (reader.Read()) { Customer c = 新 Customer(); c.CustomerID = reader.GetString(0); c.CompanyName = reader.GetString(1); c.ContactName = reader.GetString(2); c.Country = reader.GetString(3); list.Add(c); } cnn.Close(); return list; }
public static List |
GetAllCustomers() { SqlConnection cnn = new SqlConnection( ConfigurationManager.ConnectionStrings ["NorthwindConnectionString"].ConnectionString); SqlCommand cmd = new SqlCommand(); cmd.Connection = cnn; cmd.CommandText = "select CustomerID,CompanyName,ContactName,Country from customers"; cnn.Open(); SqlDataReader reader = cmd.ExecuteReader(); List |
(); while (reader.Read()) { Customer c = 新 Customer(); c.CustomerID = reader.GetString(0); c.CompanyName = reader.GetString(1); c.ContactName = reader.GetString(2); c.Country = reader.GetString(3); list.Add(c); } cnn.Close(); return list; }
} }
|
Customer類別定義了四個公共屬性,分別是CustomerID、CompanyName、ContactName和Country。 在之後,是這個類別所包含的兩個靜態方法– GetCustomersForContry()和GetAllCustomers()。 這兩個方法都是比較簡單的,一個是傳回屬於某一個國家的所有顧客訊息,另一個是回傳全部顧客資訊。 先開啟Northwind資料庫的連接,然後透過SqlCommand物件執行SELECT查詢。 之後,用SqlDataReader物件來取得資料。 遍歷這個SqlDataReader對象,在其內部每次都會建立一個Customer對象,然後設定它的各個屬性,最後把其加入到Customer物件的泛型集合中。 在類別的結尾處就是把這個Customer物件的泛型集合回傳給呼叫者。
建立資料來源
設計報表的時候,需要在你的專案中為其指定一個資料來源。 在你的專案中新增一個資料來源可以這樣做,選擇「資料」選單-> 新增資料來源。 然後將會出現如下圖所示的對話框:
你的資料來源可以是資料庫、web service或是物件。 本例中我們選擇的是物件。 然後點擊“下一步”按鈕,會彈出讓我們選擇資料來源的介面。 我們選擇的是Customer類別(如下圖)。
點選「完成」按鈕後就完成了資料來源配置精靈。 這樣,你就在你的類別庫中加入了一個新的資料來源。 如果要查看資料來源的話可以這麼做,選擇「資料」選單-> 顯示資料來源,就會出現如下圖所示的介面:
設計報表
接下來新增一個報表。 右鍵點選項目,選擇“新增項目”。 在對話方塊裡選擇“報表”,並點選“新增”按鈕(如下圖所示)。 這樣,我們就新增了一個名為「Report1.rdlc」的檔案。 .rdlc檔案是一個報表文件,它保存的是報表佈局和資料對應。
一旦你開啟了Report1.rdlc文件,Visual Studio的工具箱裡就會顯示出一套與報表相關的控制項(如下所示)。
在這些控制項中,「文字方塊」控制項和「表格」控制項是非常常用的。 「文字方塊」控制項用來顯示一段靜態文字或是一個表達式。 「表」控制項用於顯示表格數據,其產生的結果會顯示在你的報表的「主體」中。
設計出的報表如下圖所示:
在報表的「頁首」部分的頭部,有一個文字框,其Value屬性的值為「Customer Listing」。 在這個文字框的下面還有另一個文字框,其Value屬性的值為「=Parameters!SubTitle.Value」。它的意思就是指明文字方塊的值來自名為SubTitle的參數。 我們如何來定義參數呢? 這需要在報表的ReportParameters屬性中新增參數。 開啟的報表參數對話框如下圖所示:
請注意:參數的設定是在我們的.NET程式碼中完成的。
如果要在報表上顯示日期的話,只要設定相關的文字方塊的Value屬性為「=FormatDateTime(ToDay(),DateFormat.ShortDate)」即可。 報表的一大優點就是有很多的內建函數,如ToDay()和FormatDateTime之類的。 在本例中,我們使用FormatDateTime()函數來以ShortDate的格式顯示目前的日期(ToDay())。
現在,從工具箱裡拖曳一個「表」控製到你的報表上。 預設情況下,「表」控制項有3行3列,3行分別是:表頭、詳細資料和表尾。 當然,你也可以為「表格」控制項新增行和列。 從資料來源視窗拖曳CustomerID、CompanyName、ContactName和Country屬性到你的「表格」控制項的詳細資料行。 這樣,系統將會自動地新增文字框,並設定其屬性為=Fields!CustomerID.Value、=Fields!CompanyName.Value之類的。 此時,列頭也會自動地加入。 當然,你也可以根據你的需求做你需要的修改。
接下來,我們要依顧客所屬的國家將記錄分組。 右鍵點選詳細資料行的邊框,選擇插入群組(如下圖所示)。
然後將會出現如下圖所示的對話框:
在「排序」標籤中選擇「=Fields!Country.Value」作為表達式,選擇「Ascending」作為排序方向。
就是這些東西,很簡單吧。 這樣,我們就完成報表的設計了。
顯示報表
新建一個名為「ReportViewerDemo」的web站點。 加入ReportViewerLib組件的引用,這樣該組件就會拷貝到你的web站點的BIN目錄下。 之後,把Report1.rdlc檔案加入你的web站點。 在工具箱的「資料」標籤中拖曳一個ReportViewer控制項到你的Default.aspx頁上, 開啟ReportViewer控制項的智慧標記面板,在「選擇報表」的下拉方塊中選擇Report1.rdlc,如下圖所示:
選擇好報表檔案後,系統會自動地新增一個TypeName屬性為Customer的物件資料來源控制項。 你可以在物件資料來源控制項的設定精靈中驗證一下。
接下來,拖曳一個DropDownList控製到頁的頭部,並為其設定4個選項– All、USA、UK和Brazil。 同時設定它的AutoPostBack屬性為True。 然後,開啟資料來源控制項的設定精靈,設定「SELECT」操作為SelectCustomersForCountry()方法。
設定SelectCustomersForCountry()方法的country參數為DropDownList1的SelectedValue。
預設情況下,將在報表中顯示所有顧客資訊。 當你在DropDownList選擇了一個國家的時候,報表中就會顯示屬於你所選擇的國家的顧客資訊。 要完成這樣的功能,我們只需要處理DropDownList的SelectedIndexChanged事件。
protected void DropDownList1_SelectedIndexChanged (object sender, EventArgs e) { if (DropDownList1.SelectedValue == "All") { ObjectDataSource1.SelectMethod = "GetAllCustomers"; ObjectDataSource1.SelectParameters.Clear(); ReportParameter param = new ReportParameter ("SubTitle", "List of all the customers"); ReportParameter[] p ={ param }; ReportViewer1.LocalReport.SetParameters(p); } else { ObjectDataSource1.SelectMethod = "GetCustomersForCountry"; ObjectDataSource1.SelectParameters[0].DefaultValue = DropDownList1.SelectedValue;
ReportParameter param = new ReportParameter ("SubTitle", "List of customers for a country"); ReportParameter[] p ={ param }; ReportViewer1.LocalReport.SetParameters(p); } } |
這段程式碼首先檢查DropDownList控制項的SelectedValue屬性。 如果是「All」的話就設定資料來源控制項的SelectMethod屬性為GetAllCustomers。 另外,我們還需要清空SelectParameters集合,因為GetAllCustomers()方法不需要任何參數。 接下來,我們建立一個ReportParameter類別的實例,並在其建構函式中設定報表的參數名稱和參數值。 回想一下我們在設計報表時定義的參數。 然後再建立一個ReportParameter數組。 呼叫SetParameters()方法,並用這個陣列作為其參數。 「else」程式碼區塊也非常簡單,就是使用的方法變成了GetCustomersForCountry()而已。
就是這些東西,很簡單吧。 報表已經搞定了。 你可以執行Default.aspx頁看看效果。 注意,ReportViewer控制項已經內建了匯出特性,它允許你把報表匯出為Excel或PDF格式。 ReportViewer控制項還很多的屬性,你可以自己摸索一下。
總結
ASP.NET的ReportViewer控制項提供了許多報表的基本功能。 在本文中,我們使用了物件資料來源控制項來開發一個報表。 我們創建了一個類別庫和一個資料來源。 最後使用ReportViewer控制項來顯示報表。