`
micc010
  • 浏览: 69036 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

Asp.net中动态控制RDLC报表

    博客分类:
  • .net
阅读更多
在asp.net程序中,可以选择使用水晶报表,功能确实强大。但是web版的水晶报表好像存在版权的问题。
如果所作报表不是复杂的一塌糊涂的话,可以使用微软自带的Rdlc报表。

已经有老兄做出了不少诠释:http://www.cnblogs.com/waxdoll/
更多资料可以在这里找到:http://www.gotreportviewer.com/

Rdlc优点:
1:Rdlc报表设计简单
2:结果存成xml,易于控制
3:导出格式作的很不错

这里所说的动态控制报表所指的是:在一些时候,制作了报表之后希望在运行中可以动态的做一些小修改,比如说列的位置,用户控制显示那些列等等。

控制方法,尝试了这么几种:
1:控制微软提供的报表对象的属性;
2:报表全部自动生成
3:修改报表源文件,然后加载。

控制微软提供的报表对象的属性:基于这个功能需求,一开始我想到的方法是通过控制微软提供的这些报表对象的属性来实现。因为这种方法最人道了。但是事与愿违,微软的ReportViewer对象是用来显示Report的,自然不行;我使用的report是自己设计的,localReport,找到Report对象,里面方法有这个几个:report.GetDefaultPageSettings();report.GetDocumentMap()等,第一个是获取打印纸张德设置,第二个是获取doc文档(但是始终出错),都是只读属性;所以,第一种尝试失败。

第二种方法就是报表全部自动生成。可以找到一个完整的例子,在这里:http://www.gotreportviewer.com/DynamicTable.zip
这个例子里面,他把xml结构的rdlc报表写成一个类ReportDefinition,然后通过自定义这个类的内容来得到一个报表。其实际还是为了自己构造一个报表对象的xml。这是加载自定义报表的过程:win下的代码
          
this.reportViewer1.Reset();
            this.reportViewer1.LocalReport.LoadReportDefinition(m_rdl);
            this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("MyData", m_dataSet.Tables[0]));
            this.reportViewer1.RefreshReport();

这是自动生成xml的代码:
     
 private MemoryStream GenerateRdl(List<string> allFields, List<string> selectedFields)
        {
            MemoryStream ms = new MemoryStream();
            RdlGenerator gen = new RdlGenerator();
            gen.AllFields = allFields;
            gen.SelectedFields = selectedFields;
            gen.WriteXml(ms);
            ms.Position = 0;
            return ms;
        }

这是完全ReportDefinition的一部分定义:
namespace Rdl {
    using System.Xml.Serialization;
    
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition", IsNullable=false)]
    public partial class Report {
        
        private object[] itemsField;

       
但是几经考虑之后,这个方案也不让人满意,原因是:所有的报表对象都得自己生成,一下子回到了解放前,没有可视化工具的设计既繁琐又复杂。特别是如果设计几个line,然后再来上几个分组的话,工作量巨大。

于是乎尝试第三种方法:ReportVivwer加载报表前在内存中修改报表源文件。这个方法比较狠,其实可以解决很多问题,包括设计自定义的打印纸张等(这里有另外一种设置打印纸张的方法http://waxdoll.cnblogs.com/archive/2006/03/03/342435.html)。
设计思路是:首先加载rdlc文件到一个XmlDocument对象;然后修改xml内容;把xml序列化成字节流,交给ReportViewer显示。
这是这一段代码:
  
public MemoryStream GenerateRdlc()
    {
           XmlDocument sourceDoc = new XmlDocument();
        string path = AppDomain.CurrentDomain.BaseDirectory + "Test/OrderList.rdlc";
        sourceDoc.Load(path);
        Hashtable reportColumns = GetReportColumns(sourceDoc.LastChild);
        //just remove
        for (int i = 0; i < reportColumns.Count; i++)
        {
            if (!FindReportCoulmns(reportColumns[i].ToString()))
            {
                RemoveColumnFromRdlc(sourceDoc.LastChild, i);
            }
        }

        MemoryStream ms = new MemoryStream();
        XmlSerializer serializer = new XmlSerializer(typeof(XmlDocument));
        serializer.Serialize(ms, sourceDoc);
        ms.Position = 0;
        return ms;
    }

至于如何GetReportColumns和RemoveColumnFromRdlc,那就很简单了,就是一个操作xml对象的过程。比方说
 private Hashtable GetReportColumns(XmlNode root)
    {
        Hashtable cols = new Hashtable();
        //XmlNamespaceManager s=new XmlNamespaceManager(
        XmlNode cells = FindChildNode(root,"Body/ReportItems/Table/Header/TableRows/TableRow/TableCells");
        for (int i = 0; i < cells.ChildNodes.Count; i++)
        {
            XmlNode cell =FindChildNode( cells.ChildNodes[i],"ReportItems/Textbox/DataElementName");
            cols[i] = cell.InnerText;
        }
        return cols;
    }


这是使用这一段的代码
          
this.ReportViewer1.LocalReport.LoadReportDefinition(this.Report.GenerateRdlc());
            this.ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", result.Tables[0]));
            this.ReportViewer1.LocalReport.Refresh();
分享到:
评论

相关推荐

    ASP.NET中动态控制RDLC报表

    ASP.NET中动态控制RDLC报表,开发.net爱好者的福音。在asp.net程序中,可以选择使用水晶报表,功能确实强大。但是web版的水晶报表好像存在版权的问题。如果所作报表不是复杂的一塌糊涂的话,可以使用微软自带的Rdlc...

    Asp.net的ReportViewer的RDLC设计及动态绑定数据源

    Asp.net的ReportViewer的RDLC设计及动态绑定数据源

    ASP.NET下使用RDLC操作报表

    这是关于ASP.NET中RDLC进行报表操作的3个文档,是Word文件形式,有属性及方法介绍,还有完整实例。

    asp.net -rdlc报表教程

    asp.net rdlc报表使用教程,doc文档

    ASP.NET RDLC报表实例代码,对学习报表的很有用

    ASP.NET RDLC报表实例代码,对学习报表的很有用

    MVC下使用RDLC报表的示例

    MVC下使用RDLC报表的示例。之前找了大半天。有图形报表,也有记录集报表。

    asp.net rdlc报表代码实例

    asp.net rdlc报表代码实例。有显示多条数据,显示单条数据,子报表等代码实例。做项目需要的可以看看。

    asp.net 报表 rdlc官方例子下载

    官方rdlc实例讲述报表的运用,里面有例子供大家参考

    asp.net-rdlc:asp.net-rdlc 报表入门

    asp.net-rdlcasp.net-rdlc 报表入门

    asp.net 动态生成rdlc报表(原创)

    代码如下: string cCount = “”; string dCount = “”; string jCount = “”; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string id = Request.QueryString[“OrderID”] == ...

    RDLC报表工具使用说明

    在asp.net里利用RDLC生成报表的工具

    MVC报表使用实战

    ASP.NET中RDLC报表使用技巧,实战源码,工作经验总结

    直接打印RDLC报表

    直接调用,传递参数即可 可在asp.net下或winform下使用,无需预览直接进行打印,可根据自己的需要进行修改 有适当的备注

    asp.net知识库

    asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL-DMO实现定制SQL Scripts Create Tables and Build inserts from Tables by using ...

    ASP.NET技巧:教你制做Web实时进度条

    网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度。我自己结合多线程和ShowModalDialog制做了一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一个Session,当任务...

    C#+RDLC+报表打印实例--带数据库

    C#+RDLC+报表打印实例--带数据库 京华志&精华志出品 希望大家互相学习,互相进步 支持CSDN 支持微软 主要包括C# ASP.NET SQLDBA 源码 毕业设计 开题报告 答辩PPT等

    ASP.NET Night Words

    18.3 rdlc报表的使用 349 18.4 总结 355 第19章 .net的文件io体系和静态页面生成技术 356 19.1 .net中的文件体系 356 19.1.1 driveinfo类 356 19.1.2 directory及directoryinfo类 359 19.1.3 file及fileinfo类...

    asp.net中rdlc 合并行的方法

    要合并内容行,我想是不可能的,我上网找了N久,也没找到,囧~ 后来经过自己的短暂思考,终于想到另一种合并了,:-) 实现方法很简单,就是在报表属性的代码里加上以下这段代码: 代码如下: Function GetRemark...

Global site tag (gtag.js) - Google Analytics