当前位置:中国站长下载文章中心网页编程.NET编程 → ASP.NET中动态控制RDLC报表(2)

ASP.NET中动态控制RDLC报表(2)

减小字体 增大字体 作者:不详  来源:不详  发布时间:2006-8-14 8:33:16
     但是几经考虑之后,这个方案也不让人满意,原因是:所有的报表对象都得自己生成,一下子回到了解放前,没有可视化工具的设计既繁琐又复杂。特别是如果设计几个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();
  
    这个方法终于成功了。
  
    附: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">  做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。