• 在vs2005中的ReportViewer(RDLC报表)中使用直接打印功能,在vs2005使用ReportViewer2008


          因为水晶报表授权价格的问题,打算在新的项目中使用Visual Studio 2005中自带的MicosoftReportViewer,但VS2005中的MicosoftReportViewer在浏览的时候不能直接打印,只能先导出为Excel或者PDF文件再使用Excel或PDFReader里边的打印实现打印,非常之不方便,也不知道M$怎么想的,不过在VS2008当中M$终于想通了,将MicosoftReportViewer作了一次升级,升级为9.0,新加了一个ActiveX插件,通过这个插件实现了在网页上直接打印。

           如果您的项目是基于VS2005的,但又想使用VS2008当中的MicosoftReportViewer功能以实现直接打印,就需要在发布网站之前修改Web.config文件中的ReportViewer控件版本之后再发布

           那么为什么是在发布之前修改版本,然后发布完成之后又需要改回来呢?可能大家会觉得很奇怪,那是因为我经过无数的方法想直接把VS中的8.0版本控件直接替换成9.0不成功之后才不得已想到的方法,因为没有办法替换掉VS2005中的控件,所以如果我们在开发时如果web.config中的版本是9.0,那么就会有控件版本冲突错误。

    具体做法请参考如下的方法:

    1. 下载Microsoft Report Viewer Redistributable 2008并安装
    http://www.microsoft.com/Downloads/details.aspx?displaylang=zh-cn&FamilyID=cc96c246-61e5-4d9e-bb5f-416d75a1b9ef

    另外提示一下,使用这个控件不需要安装Framework 3.5,因为它实际上只是多了一个ActiveX插件,并没有使用到Framework 3.5中的任何功能。

    2. 找到web.config中的如下几行,将版本号全部从8.0.0.0改为9.0.0.0
    <system.web>
       <httpHandlers>
       <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        validate="false" />

    </httpHandlers>
       <compilation debug="true">
        <assemblies>
         <add assembly="Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
         <add assembly="Microsoft.ReportViewer.Common, Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>

    </assemblies>
        <buildProviders>
         <add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.Common, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
        </buildProviders>
       </compilation>
    </system.web>

    3. 将VS2005为每个页面添加的标记注册说明去掉
    <%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

    这里有点小问题,如果我们在asp.net中引用ReportViewer控件之前没有在Web.config中添加标记注册说明,VS会在每个放置了ReportViewer控件的aspx文件中进行控件注册,所以最好的方法是在Web.config中统一进行注册,以免每次都要去删除aspx文件中的注册说明

       <pages>
        <controls>
        <add tagPrefix="rsweb" namespace="Microsoft.Reporting.WebForms" assembly="Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
        </controls>
       </pages>

    4.完成所有修改之后再编译发布网站,需要注意的是一定要在发布之前修改,发布之后再修改web.config是不行的。

    5.常见错误
    报表查看器 Web 控件 HTTP 处理程序尚未在应用程序的 web.config 文件中注册。请将 <add verb="*" path="Reserved.ReportViewerWebControl.axd" type = "Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 添加到 web.config 文件的 system.web/httpHandlers 部分。
    出现这个错误的原因是只要在VS2005中对插入了报表的aspx文件进行了编辑,VS就会自动将刚才我们改过的版本号改回8.0.0.0,再改回来就好了,不过这样改来改去也麻烦,最好的方法是使用在3步中提到的方法,对控件进行统一注册。

    a. ReportViewer关联Report1.rdlc的简单呈现
    b. 对带有报表参数的Report1.rdlc的呈现
    c. 利用程式生成的DataSet 填充报表
    d. 调用存储过程 生成DataSet 填充报表
    ==========
    简单的呈现
    ==========
    1. 打开VS2005,文件->新建->网站 选择语言种类(C#)
    2. 在该解决方案下 设计其已经生成的Default.aspx
    3. 将工具箱-数据下的ReportViewer 拉入Default.aspx的设计界面
    4. 在用鼠标选中ReportViewer1时 可以看到其右上角的 小三角 图标
    5. 用鼠标点击该小三角 将展开 ReportViewer任务 快捷菜单
    6. 由于本项目 目前还没有做好的报表 所以 选择 设计新报表
    7. 点击 设计新报表 后 将呈现报表Report1.rdlc的设计界面
    8. 由于本项目 目前还没有做好的网站数据源
       所以 此时要添加新数据源
      (如果没有呈现“网站数据源”界面,可以点击报表设计界面,
       此时上方菜单中多出现“数据”,“报表”等选项
       可以在“数据”菜单下,选择“显示数据源”)
    9. 点击“添加新数据源” 会出现“TableAdapter 配置向导”
    10. 选择数据连接(如连接到本机的Northwind数据库),下一步
    11. 选择是否要将连接字符串保存到应用程序配置文件中,下一步
    12. 选择命令类型,此时 可以 点击 取消 按钮,退出向导
    13. 全部保存
    14. 选择 视图 菜单 下 “服务器资源管理器”,
        可以看到刚才所建立的数据连接,
        可以看到Northwind数据库下的表,视图,存储过程,函数
    15. 在解决方案的树下 找到并打开App_Code文件夹下的DataSet1.xsd数据集
    16. 可以看到 打开的数据集设计器 是空的,此时可以将“服务器资源管理器”
        下的Northwind的表或存储过程等 拉入 数据集设计器
        (如此时 拉入了Orders表 和 Sales by Year这个存储过程)
    17. 全部保存
    18. 双击Report1.rdlc,打开报表设计界面
        将此时的报表设计工具箱中的 报表项 的  表 拉入 报表设计界面
    19. 选择 “数据”菜单下的“显示数据源”,
        可以在网站数据源下 看到 DataSet1 下的 两个 表 Orders 和 Sales by Year
    20. 此时选择Orders下的任意字段 (如OrderID 和 CustomerID)
        拉到Report1.rdlc设计界面的表的“详细资料”处 用于报表显示
    21. 全部保存
    22. 回到Default.aspx的设计界面,为ReportViewer1 绑定报表
        选择ReportViewer1显示刚才设计好的Report1.rdlc
    23. 全部保存,按F5或Ctrl+F5 运行,以查看初步效果

    ======================================
    接下来要为Report1.rdlc添加一个报表参数
    ======================================

    24. 回到报表Report1.rdlc的设计界面
        点击 报表 菜单 下的“报表参数”
    25. 在报表参数在设置框中 添加一个报表参数 进行相关设置 并 确定以保存
       (如其参数名称为rptParaA,类型为String)
    26. 拉入一个文本框的报表项到Report1.rdlc的设计界面 以做为该报表的标题显示
    27. 选中并右键单击该文本框,在弹出的菜单中选择“表达式”,
        进入“编辑表达式”的对话框
    28. 在“编辑表达式”的对话框中,选择 参数,
        并双击刚才设置的rptParaA,使文本框的值=Parameters!rptParaA.Value
    29. 保存对Report1.rdlc的修改
    30. 因为新的Report1.rdlc报表的文本框需要有报表参数值的传入
        所以要在ReportViewer1 对Report1.rdlc的呈现时
        对Default.aspx.cs的编辑
    31. 在Default.aspx.cs加入引用
        using Microsoft.Reporting.WebForms;   
        在Page_Load中加入如下代码


            ReportParameter rptParaA = new ReportParameter("rptParaA", "测试报表参数");
            ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { rptParaA });

    32.保存并运行 以查看效果

    =========================================
    接下来,需要对所要呈现的报表资料 进行定制
    也就是通过设计DataSet
    用符合需要的数据对报表进行资料绑定和呈现
    =========================================

    33.设置ReportViewer1的Visible为false
    34.在Default.aspx的设计界面 加入一个按钮Button1
       将通过此按钮的Click事件 实现对数据库的访问 以及DataSet的数据填充
       和对ReportViewer1的资料绑定
    35. Default.aspx.cs加入引用
        using System.Data.SqlClient;
        using Microsoft.Reporting.WebForms;

        Button1_Click中的代码示例如下

            SqlConnection myConn = new SqlConnection("Data Source=192.168.0.36;Initial Catalog=Northwind;User ID=sa;Password=sa");
            SqlDataAdapter myda = new SqlDataAdapter("select top 5 * from orders", myConn);
            DataSet myds = new DataSet();
            myConn.Open();
            myda.Fill(myds);
            myConn.Close();

            ReportViewer1.Visible = true;

            ReportParameter rptParaA = new ReportParameter("rptParaA", "测试报表参数");
            ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { rptParaA });
     
            ReportDataSource rds = new ReportDataSource("DataSet1_Orders", myds.Tables[0]);
            ReportViewer1.LocalReport.DataSources.Clear();
            ReportViewer1.LocalReport.DataSources.Add(rds);
            ReportViewer1.LocalReport.Refresh();

     
       注意ReportDataSource rds = new ReportDataSource("DataSet1_Orders", myds.Tables[0]);
           的"DataSet1_Orders"是与前台html程序的

            <rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana" Font-Size="8pt" Height="400px" Visible="False" Width="400px">
                <LocalReport ReportPath="Report1.rdlc">
                    <DataSources>
                        <rsweb:ReportDataSource DataSourceId="ObjectDataSource1" Name="DataSet1_Orders" />
                    </DataSources>
                </LocalReport>
            </rsweb:ReportViewer>
           中的<DataSources>的Name="DataSet1_Orders"是一致的

        可以通过对DataSet的填充时的sql语句等的定制 来得到所需要的数据 以便报表呈现
        需要注意的是由于ReportViewer1此时的关联报表为Report1.rdlc,所以DataSet的Tables[0]中的结构
        一定要包含Report1.rdlc所呈现的字段,所以,这里的Sql语句为select top 5 * from orders
    36.保存 运行 点击Button1 以便 报表呈现

    ===============================================
    如果 报表所要呈现的数据 来源于存储过程
    那么 在装载DataSet时 使其数据来源于存储过程即可
    ===============================================

    37.右击项目 添加新项 ,选择 报表,向项目中加入Report2.rdlc,
       设置其呈现的数据来源为存储过程 Sales by Year
       同样的在Report2.rdlc的设计界面 加入“表”报表项
       并将网站数据源下的DataSet1下的Sales by Year表中的字段
       拉入报表项“表”在详细数据中 进行显示
    38.如同Default.aspx 向项目中添加新的页面Default2.aspx
       向Default2.aspx加入一个Button 和 ReportViewer1
       并设置ReportViewer1所要呈现的报表为Report2.rdlc
       设置ReportViewer1的Visible为false
       双击Button 进行其Click事件的编写
       设置Default2.aspx为项目的起始页
    39.在Default2.aspx.cs加入引用
       using System.Data.SqlClient;
       using Microsoft.Reporting.WebForms;
    40.Button1_Click的事件代码示例如下


        protected void Button1_Click(object sender, EventArgs e)
        {
            SqlConnection myConn = new SqlConnection("Data Source=192.168.0.36;Initial Catalog=Northwind;User ID=sa;Password=sa");
            SqlDataAdapter myda = new SqlDataAdapter("Sales by Year", myConn);
            myda.SelectCommand.Parameters.AddWithValue("@Beginning_Date", "1997-10-10");
            myda.SelectCommand.Parameters.AddWithValue("@Ending_Date", "2000-10-10");
            myda.SelectCommand.CommandType = CommandType.StoredProcedure;
            DataSet myds = new DataSet();
            myConn.Open();
            myda.Fill(myds);
            myConn.Close();

            ReportViewer1.Visible = true;
           
            ReportDataSource rds = new ReportDataSource("DataSet1_Sales_by_Year", myds.Tables[0]);
            ReportViewer1.LocalReport.DataSources.Clear();
            ReportViewer1.LocalReport.DataSources.Add(rds);

            ReportViewer1.LocalReport.Refresh();
        }


    41.保存 运行 点击按钮 报表效果查看

  • 相关阅读:
    linux启动流程
    控制nginx并发链接数量和客户端请求nginx的速率
    MySQL修改密码
    nginx站点目录及文件URL访问控制
    nginx日志相关优化安全
    根据参数优化nginx的服务性能
    nginx基本安全优化
    nginx rewrite
    nginx location
    nginx访问日志(access_log)
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/1620511.html
Copyright © 2020-2023  润新知