介紹:
這篇文章是前天看園子里給的一個(gè)鏈接,具體是誰(shuí)的我忘記了,只記得http://www.codePRoject.com/aspnet/ReportViewer.asp這個(gè)地址被貼了出來(lái),然后說(shuō)因?yàn)槭裁丛蚓蜎](méi)翻譯完。我后來(lái)看了下正好對(duì)自己有用,因?yàn)楣纠颮S的東西有人在做,而樓下光電部門的BS需求也經(jīng)常有,并且早就知道有這個(gè)東西只是一直沒(méi)時(shí)間研究,正好找到這個(gè)文章,于是就好好的研究了一下午,先翻譯一下,然后再補(bǔ)充點(diǎn)心得。
翻譯的過(guò)程中盡量本地化了一下,不過(guò)保留了原文作者的意思。如果有翻譯不貼切的地方請(qǐng)各位朋友批評(píng)指正。
在網(wǎng)上有很多關(guān)于SqlServer RS 的服務(wù)模式(Server Mode),而我在研究本地模式(Local Mode)確實(shí)用了很長(zhǎng)的時(shí)間,尤其還是有參數(shù)調(diào)用的時(shí)候。
之所以要用本地模式而不是服務(wù)器模式,是因?yàn)榉?wù)模式的客戶端每次請(qǐng)求一個(gè)報(bào)表的時(shí)候,服務(wù)器都要把數(shù)據(jù)組織成報(bào)表然后發(fā)送到客戶端,雖然這樣子安全些,但是巨型報(bào)表從服務(wù)器到瀏覽器的傳輸會(huì)降低其性能。
所以這個(gè)文章是描述如何組織報(bào)表并且用asp.net2.0的ReportViewer控件讀取出來(lái)的,這里我們選用的就是本地模式,并且是使用帶參數(shù)的存儲(chǔ)過(guò)程。我所使用的是ASP.NET2.0,VisualStudio2005,還有SQLServer2005加application Block。如果你沒(méi)有Microsoft Application Block這個(gè)工具,那么就請(qǐng)把示例中通過(guò)SQL Helper調(diào)用存儲(chǔ)過(guò)程的代碼換成SQL Command的就可以了。
在這里我們選用Northwind數(shù)據(jù)庫(kù),我們的示例展現(xiàn)給用戶的就是讓用戶從下拉列表里選擇貨品名稱然后在報(bào)表里篩選出信息來(lái)。
第一步,創(chuàng)建帶參數(shù)的存儲(chǔ)過(guò)程
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設(shè)計(jì)器創(chuàng)建一個(gè)DataSet下的DataTable
在解決方案管理器界面里,右鍵App_Code這個(gè)文件佳,選擇”Add New Item”。在彈出的對(duì)話框里選擇”DataSet”,給它起個(gè)名,比如DataSetProducts.xsd,然后點(diǎn)擊”Add”按鈕。這時(shí)候TableAdapter配置工具會(huì)自動(dòng)出現(xiàn),如果沒(méi)有出現(xiàn)或者誤將其關(guān)閉了的話,在DataSet設(shè)計(jì)器的任何一個(gè)地方點(diǎn)擊鼠標(biāo)右鍵,選擇Add,然后再選擇TableAdapter這個(gè)工具就會(huì)再次出現(xiàn)。根據(jù)向?qū)?lái)建立DataTable,在出現(xiàn)的界面中分別選擇”User existing stored procedures”作為命令類型然后指定”ShowProductByCategory”作為Select命令。
在第一步創(chuàng)建的存儲(chǔ)過(guò)程在第二步里就變成了一個(gè)DataTable,而報(bào)表數(shù)據(jù)就是通過(guò)這個(gè)DataTable提供的。
圖一:包含一個(gè)DataTable的DataSetProducts.xsd就是報(bào)表的數(shù)據(jù)源
第三步:創(chuàng)建一個(gè)報(bào)表文件
在解決發(fā)方案管理器下右鍵選擇Add New Item,然后選擇Report模板。在這個(gè)示例里是直接用默認(rèn)的名Report.rdlc的。rdl的意思是報(bào)表定義語(yǔ)言,c的意思就是客戶端(client)。也就是說(shuō),rdl是個(gè)服務(wù)器報(bào)表,而rdlc是本地報(bào)表。
在工具箱里把Table拖拽到報(bào)表設(shè)計(jì)窗體中,這個(gè)”表”有三個(gè)部分,頭,內(nèi)容和尾。一個(gè)Table就是一個(gè)顯示數(shù)據(jù)的區(qū)域,一個(gè)區(qū)域顯示的是被綁定到的DataSet下的那些數(shù)據(jù)元素。盡管一個(gè)報(bào)表是可以擁有很多的區(qū)域的,但是,每個(gè)區(qū)域只能顯示一個(gè)DataSet里的內(nèi)容。基于這點(diǎn),我們可以用存儲(chǔ)過(guò)程來(lái)聯(lián)合多張表的數(shù)據(jù)到一個(gè)DataSet里來(lái)填充報(bào)表。
圖二:工具欄里的專門做報(bào)表模板的控件
打開(kāi)”網(wǎng)站數(shù)據(jù)源”窗口,找到”DataSetProducts”數(shù)據(jù)集,就是在第二步里創(chuàng)建的那個(gè)。展開(kāi)直到看到叫”ShowProductByCategory”的這個(gè)DataTable。這個(gè)Table叫這個(gè)名字是因?yàn)槲覀冎霸赥ableAdapter配置向?qū)Ю镞x擇了“Use existing stored procedure”這項(xiàng),并且我們的存儲(chǔ)過(guò)程的名字就叫ShowProductByCategory。
在網(wǎng)站數(shù)據(jù)源窗口中依次把ProductName,UnitPrice和UnitsInStock這三項(xiàng)分別拽到報(bào)表設(shè)計(jì)器里顯示細(xì)節(jié)的那一行,也就是中間那行的第一列,第二列和第三列。而且你可以右鍵單擊任何一個(gè)顯示細(xì)節(jié)行中的字段,然后在屬性欄里找到Format標(biāo)簽來(lái)為Unit Price和Unit In Stock來(lái)定義它們的顯示格式。
圖三,網(wǎng)站數(shù)據(jù)源窗體顯示了在你程序里定義的DataSet以及它們所擁有的列
第四步:在ASP.NET2.0頁(yè)里加入ReportViewer控件
首先把DropDownList控件拽到表單里,然后用選擇數(shù)據(jù)源選項(xiàng)的方法把Categories里的CategoryName字段進(jìn)行綁定。在其它場(chǎng)景中用戶可以通過(guò)其它方法比如文本框的方式來(lái)輸入?yún)?shù)然后傳遞到存儲(chǔ)過(guò)程當(dāng)中。
然后,把Report View控件拖拽到表單中,并且設(shè)置其Visible屬性為False。還有需要注意的地方就是,ASP.NET2.0的Report Viewer提供Excel和PDF的導(dǎo)出方式,然而實(shí)際的過(guò)程中我發(fā)現(xiàn),打印出來(lái)的報(bào)表和你設(shè)計(jì)時(shí)的樣子總會(huì)有點(diǎn)誤差。
圖四,把這頁(yè)設(shè)置成為StartUp頁(yè)
下一步,調(diào)出Report Viewer的智能標(biāo)簽,選擇剛才建立好的Report.rdlc文件。
圖五,把報(bào)表定義文件聯(lián)合到Report Viewer控件里。
第五步:寫代碼實(shí)現(xiàn)用戶在下拉框選擇不同的名稱然后報(bào)表里顯示不同的數(shù)據(jù)
這里不要忘記把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>
第六步:運(yùn)行報(bào)表
按F5鍵,單擊”Run Report”按鈕運(yùn)行報(bào)表。
圖六,運(yùn)行報(bào)表
最后要確定ReportViewer被引入到網(wǎng)站中,并且要配置下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>
當(dāng)把有ReportViewer控件的網(wǎng)站項(xiàng)目部署到別的服務(wù)器的時(shí)候,你需要把C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/BootStrapper/Packages/ReportViewer/ReportViewer.exe這個(gè)文件拷貝出來(lái),然后在目標(biāo)服務(wù)器運(yùn)行一下。
翻譯心得:似乎做過(guò)的翻譯中這個(gè)是最簡(jiǎn)單的了,不過(guò)可能也是作者說(shuō)的比較簡(jiǎn)介明了。
學(xué)習(xí)心得:作者闡述了兩種ReportViewer能接受的報(bào)表方式并且做了簡(jiǎn)單的分析。不過(guò)在實(shí)際項(xiàng)目中用Server Mode的可能會(huì)更多些吧,Local Mode做一些不是規(guī)模太大或者太復(fù)雜的報(bào)表還是可以的。
公司里有專門做RS的我知道,據(jù)說(shuō)做就要做一周,運(yùn)行的時(shí)候看編寫的質(zhì)量,十分鐘是正常的,而超過(guò)三十分鐘的話就可能需要考慮改算法了。聽(tīng)起來(lái)好恐怖,呵呵,不過(guò),如果能用到樓下光電部門的報(bào)表需求的話,我想要比以前GridView to Excel的方式更舒服一些。
如果這個(gè)能研究明白的話打算做一個(gè)專門的入門視頻講解來(lái)幫助更多的人了解這個(gè)控件。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注