自定义报表

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();
这个方法终于成功了。
附:rdlc文件的xml一段结构
 xml结构
 1<?xml version="1.0" encoding="utf-8"?>
 2<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
 3  <DataSources>
 4    <DataSource Name="ConnectionString">
 5      <ConnectionProperties>
 6        <ConnectString />
 7        <DataProvider>SQL</DataProvider>
 8      </ConnectionProperties>
 9      <rd:DataSourceID>073016a7-6cb0-4e06-a6fd-f5882a039188</rd:DataSourceID>
10    </DataSource>
11  </DataSources>
12  <BottomMargin>2.5cm</BottomMargin>
13  <RightMargin>2.5cm</RightMargin>
14  <PageWidth>21cm</PageWidth>
15  <rd:DrawGrid>true</rd:DrawGrid>
16  <InteractiveWidth>21cm</InteractiveWidth>
17  <rd:GridSpacing>0.25cm</rd:GridSpacing>
18  <rd:SnapToGrid>true</rd:SnapToGrid>
19  <Body>
20    <ColumnSpacing>1cm</ColumnSpacing>
21    <ReportItems>
22      <Chart Name="chart1">

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值