国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

使用ASP.NET2.0的ReportViewer查看RDLC報(bào)表

2019-11-18 16:57:39
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

介紹:

這篇文章是前天看園子里給的一個(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è)控件。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 梁山县| 响水县| 观塘区| 从化市| 鹰潭市| 乡宁县| 平利县| 安吉县| 将乐县| 于都县| 桐乡市| 五峰| 天水市| 突泉县| 临漳县| 鲜城| 花莲市| 重庆市| 利津县| 石家庄市| 游戏| 三穗县| 贵州省| 南投县| 桐柏县| 太仆寺旗| 宾川县| 杭州市| 醴陵市| 玛多县| 鄂托克旗| 枣庄市| 诏安县| 杭州市| 徐州市| 绥滨县| 垣曲县| 志丹县| 临武县| 凤台县| 台东市|