介紹:
這篇文章是前天看園子里給的一個鏈接,具體是誰的我忘記了,只記得http://www.codePRoject.com/aspnet/ReportViewer.asp這個地址被貼了出來,然后說因為什么原因就沒翻譯完。我后來看了下正好對自己有用,因為公司里RS的東西有人在做,而樓下光電部門的BS需求也經常有,并且早就知道有這個東西只是一直沒時間研究,正好找到這個文章,于是就好好的研究了一下午,先翻譯一下,然后再補充點心得。
翻譯的過程中盡量本地化了一下,不過保留了原文作者的意思。如果有翻譯不貼切的地方請各位朋友批評指正。
在網上有很多關于SqlServer RS 的服務模式(Server Mode),而我在研究本地模式(Local Mode)確實用了很長的時間,尤其還是有參數調用的時候。
之所以要用本地模式而不是服務器模式,是因為服務模式的客戶端每次請求一個報表的時候,服務器都要把數據組織成報表然后發送到客戶端,雖然這樣子安全些,但是巨型報表從服務器到瀏覽器的傳輸會降低其性能。
所以這個文章是描述如何組織報表并且用asp.net2.0的ReportViewer控件讀取出來的,這里我們選用的就是本地模式,并且是使用帶參數的存儲過程。我所使用的是ASP.NET2.0,VisualStudio2005,還有SQLServer2005加application Block。如果你沒有Microsoft Application Block這個工具,那么就請把示例中通過SQL Helper調用存儲過程的代碼換成SQL Command的就可以了。
在這里我們選用Northwind數據庫,我們的示例展現給用戶的就是讓用戶從下拉列表里選擇貨品名稱然后在報表里篩選出信息來。
第一步,創建帶參數的存儲過程
ALTER PROCEDURE ShowProductByCategory(@CategoryName nvarchar(15) )
AS
SELECT Categories.CategoryName, Products.ProductName,
Products.UnitPrice, Products.UnitsInStock
FROM Categories INNER JOIN Products ON
Categories.CategoryID = Products.CategoryID
WHERE CategoryName=@CategoryName
RETURN
第二步,使用DataSet設計器創建一個DataSet下的DataTable
在解決方案管理器界面里,右鍵App_Code這個文件佳,選擇”Add New Item”。在彈出的對話框里選擇”DataSet”,給它起個名,比如DataSetProducts.xsd,然后點擊”Add”按鈕。這時候TableAdapter配置工具會自動出現,如果沒有出現或者誤將其關閉了的話,在DataSet設計器的任何一個地方點擊鼠標右鍵,選擇Add,然后再選擇TableAdapter這個工具就會再次出現。根據向導來建立DataTable,在出現的界面中分別選擇”User existing stored procedures”作為命令類型然后指定”ShowProductByCategory”作為Select命令。
在第一步創建的存儲過程在第二步里就變成了一個DataTable,而報表數據就是通過這個DataTable提供的。
圖一:包含一個DataTable的DataSetProducts.xsd就是報表的數據源
第三步:創建一個報表文件
在解決發方案管理器下右鍵選擇Add New Item,然后選擇Report模板。在這個示例里是直接用默認的名Report.rdlc的。rdl的意思是報表定義語言,c的意思就是客戶端(client)。也就是說,rdl是個服務器報表,而rdlc是本地報表。
在工具箱里把Table拖拽到報表設計窗體中,這個”表”有三個部分,頭,內容和尾。一個Table就是一個顯示數據的區域,一個區域顯示的是被綁定到的DataSet下的那些數據元素。盡管一個報表是可以擁有很多的區域的,但是,每個區域只能顯示一個DataSet里的內容?;谶@點,我們可以用存儲過程來聯合多張表的數據到一個DataSet里來填充報表。
圖二:工具欄里的專門做報表模板的控件
打開”網站數據源”窗口,找到”DataSetProducts”數據集,就是在第二步里創建的那個。展開直到看到叫”ShowProductByCategory”的這個DataTable。這個Table叫這個名字是因為我們之前在TableAdapter配置向導里選擇了“Use existing stored procedure”這項,并且我們的存儲過程的名字就叫ShowProductByCategory。
在網站數據源窗口中依次把ProductName,UnitPrice和UnitsInStock這三項分別拽到報表設計器里顯示細節的那一行,也就是中間那行的第一列,第二列和第三列。而且你可以右鍵單擊任何一個顯示細節行中的字段,然后在屬性欄里找到Format標簽來為Unit Price和Unit In Stock來定義它們的顯示格式。
圖三,網站數據源窗體顯示了在你程序里定義的DataSet以及它們所擁有的列
第四步:在ASP.NET2.0頁里加入ReportViewer控件
首先把DropDownList控件拽到表單里,然后用選擇數據源選項的方法把Categories里的CategoryName字段進行綁定。在其它場景中用戶可以通過其它方法比如文本框的方式來輸入參數然后傳遞到存儲過程當中。
然后,把Report View控件拖拽到表單中,并且設置其Visible屬性為False。還有需要注意的地方就是,ASP.NET2.0的Report Viewer提供Excel和PDF的導出方式,然而實際的過程中我發現,打印出來的報表和你設計時的樣子總會有點誤差。
圖四,把這頁設置成為StartUp頁
下一步,調出Report Viewer的智能標簽,選擇剛才建立好的Report.rdlc文件。
圖五,把報表定義文件聯合到Report Viewer控件里。
第五步:寫代碼實現用戶在下拉框選擇不同的名稱然后報表里顯示不同的數據
這里不要忘記把Microsoft.Reporting.WebForms命名空間加入到你的code-behind(或code file)文件里。
1<PRE lang=cs id=pre1 style="MARGIN-TOP: 0px">using System;
2using System.Data;
3using System.Data.SqlClient;
4using System.Configuration;
5using System.Collections;
6using System.Web;
7using System.Web.Security;
8using System.Web.UI;
9using System.Web.UI.WebControls;
10using System.Web.UI.WebControls.WebParts;
11using System.Web.UI.HtmlControls;
12using Microsoft.ApplicationBlocks.Data;
13using Microsoft.Reporting.WebForms;
14
15public partial class ReportViewerLocalMode : System.Web.UI.Page
16{
17 public string thisConnectionString =
18 ConfigurationManager.ConnectionStrings[
19 "NorthwindConnectionString"].ConnectionString;
20
21 /**//*I used the following statement to show if you have multiple
22 input parameters, declare the parameter with the number
23 of parameters in your application, ex. New SqlParameter[4]; */
24
25 public SqlParameter[] SearchValue = new SqlParameter[1];
26
27 protected void RunReportButton_Click(object sender, EventArgs e)
28 {
29 //ReportViewer1.Visible is set to false in design mode
30 ReportViewer1.Visible = true;
31 SqlConnection thisConnection = new SqlConnection(thisConnectionString);
32 System.Data.DataSet thisDataSet = new System.Data.DataSet();
33 SearchValue[0] = new SqlParameter("@CategoryName",
34 DropDownList1.SelectedValue);
35
36 /**//* Put the stored procedure result into a dataset */
37 thisDataSet = SqlHelper.ExecuteDataset(thisConnection,
38 "ShowProductByCategory", SearchValue);
39
40 /**//*or thisDataSet = SqlHelper.ExecuteDataset(thisConnection,
41 "ShowProductByCategory", dropdownlist1.selectedvalue);
42 if you only have 1 input parameter */
43
44 /**//* Associate thisDataSet (now loaded with the stored
45 procedure result) with the ReportViewer datasource */
46 ReportDataSource datasource = new
47 ReportDataSource("DataSetProducts_ShowProductByCategory",
48 thisDataSet.Tables[0]);
49
50 ReportViewer1.LocalReport.DataSources.Clear();
51 ReportViewer1.LocalReport.DataSources.Add(datasource);
52 if (thisDataSet.Tables[0].Rows.Count == 0)
53 {
54 lblMessage.Text = "Sorry, no products under this category!";
55 }
56
57 ReportViewer1.LocalReport.Refresh();
58 }
59}</PRE>
第六步:運行報表
按F5鍵,單擊”Run Report”按鈕運行報表。
圖六,運行報表
最后要確定ReportViewer被引入到網站中,并且要配置下web.config文件,它有可能是如下的格式:
<httpHandlers>
<add path="Reserved.ReportViewerWebControl.axd" verb="*"
type="Microsoft.Reporting.WebForms.HttpHandler,
Microsoft.ReportViewer.WebForms,
Version=8.0.0.0, Culture=neutral,
PublicKeyToken=?????????????"
validate="false" />
</httpHandlers>
當把有ReportViewer控件的網站項目部署到別的服務器的時候,你需要把C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/BootStrapper/Packages/ReportViewer/ReportViewer.exe這個文件拷貝出來,然后在目標服務器運行一下。
翻譯心得:似乎做過的翻譯中這個是最簡單的了,不過可能也是作者說的比較簡介明了。
學習心得:作者闡述了兩種ReportViewer能接受的報表方式并且做了簡單的分析。不過在實際項目中用Server Mode的可能會更多些吧,Local Mode做一些不是規模太大或者太復雜的報表還是可以的。
公司里有專門做RS的我知道,據說做就要做一周,運行的時候看編寫的質量,十分鐘是正常的,而超過三十分鐘的話就可能需要考慮改算法了。聽起來好恐怖,呵呵,不過,如果能用到樓下光電部門的報表需求的話,我想要比以前GridView to Excel的方式更舒服一些。
如果這個能研究明白的話打算做一個專門的入門視頻講解來幫助更多的人了解這個控件。
新聞熱點
疑難解答