亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

ASP.NET中動態控制RDLC報表

2020-01-18 01:54:48
字體:
來源:轉載
供稿:網友
  在asp.net程序中,可以選擇使用水晶報表,功能確實強大。但是web版的水晶報表好像存在版權的問題。如果所作報表不是復雜的一塌糊涂的話,可以使用微軟自帶的Rdlc報表。

  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();

  這個方法終于成功了。

  附: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">
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91在线高清视频| 亚洲国产女人aaa毛片在线| 久久久国产精品视频| 久久精视频免费在线久久完整在线看| 精品国产福利在线| 亚洲韩国日本中文字幕| 91精品视频在线免费观看| 成人欧美一区二区三区黑人| 福利一区视频在线观看| 亚洲春色另类小说| 国产精品久久久久久久av大片| 久久成年人免费电影| 久久精品国产一区二区三区| 亚洲欧美国产视频| 91在线观看免费高清| 国产成人精品久久二区二区| 国产网站欧美日韩免费精品在线观看| 欧美性xxxx极品高清hd直播| 亚洲已满18点击进入在线看片| 亚洲曰本av电影| 国产91精品最新在线播放| 久久久久久久97| 亚洲午夜精品视频| 日韩精品在线免费观看| 精品爽片免费看久久| 91精品久久久久久久久不口人| 日韩精品极品在线观看| 精品久久香蕉国产线看观看亚洲| 亚洲精品久久久久中文字幕欢迎你| 欧美韩国理论所午夜片917电影| 欧美一区视频在线| 国产精品福利久久久| 欧美午夜女人视频在线| 日韩视频永久免费观看| 午夜精品一区二区三区在线| 精品少妇v888av| 欧美激情在线有限公司| 国产精品福利小视频| 92国产精品久久久久首页| 国产成人一区二区三区电影| 亚洲性生活视频在线观看| 亚洲成人精品视频在线观看| 日韩成人激情影院| 欧美性xxxxx极品| 欧美亚洲在线观看| 最近2019中文免费高清视频观看www99| 国产成人精品免高潮费视频| 日韩在线观看电影| 欧美电影院免费观看| 日韩大胆人体377p| 欧美精品久久久久久久免费观看| 国产视频在线一区二区| 岛国av一区二区| 久久精品国产欧美激情| 国产欧美亚洲视频| 久久精品亚洲一区| 亚洲欧美日韩天堂一区二区| 欧美午夜久久久| 久久久久久国产精品三级玉女聊斋| 日韩成人中文字幕在线观看| 欧美国产一区二区三区| 欧美日韩免费观看中文| 亚洲视频第一页| 国产精品一二区| 成人免费黄色网| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲色图欧美制服丝袜另类第一页| 5566日本婷婷色中文字幕97| 精品高清一区二区三区| 国产午夜精品麻豆| 欧美影院成年免费版| 国产精品久久久久7777婷婷| 亚洲日韩欧美视频一区| 欧美日韩国产精品一区二区不卡中文| 国产精品xxxxx| 亚洲性生活视频| 中文字幕一精品亚洲无线一区| 欧美极品少妇xxxxⅹ免费视频| 在线播放亚洲激情| 欧美在线视频网| 日韩电影中文字幕一区| 亚洲精品电影在线观看| 欧美最顶级丰满的aⅴ艳星| 亚洲精品一区中文| 国产精品免费一区豆花| 91久久精品久久国产性色也91| 欧美日韩亚洲精品内裤| 日韩成人在线网站| 亚洲成人中文字幕| 中文字幕视频一区二区在线有码| 精品magnet| 欧美日韩中文字幕在线视频| 精品高清美女精品国产区| 亚洲国产成人在线播放| xvideos成人免费中文版| 亚洲成色999久久网站| 国产亚洲日本欧美韩国| 国模吧一区二区三区| 久久精品国产91精品亚洲| 国产成人精品视频在线| 久久精品成人一区二区三区| 色无极影院亚洲| 国产成人精品av| 国产日韩精品一区二区| 69av在线视频| 精品毛片三在线观看| 日韩欧美中文字幕在线观看| 欧美一区二区三区四区在线| 久久九九国产精品怡红院| 中文字幕国内精品| 日韩中文字幕在线视频播放| 国产精品欧美亚洲777777| 国产亚洲欧美日韩精品| 久久99视频免费| 欧美激情综合亚洲一二区| 91亚洲国产成人久久精品网站| 午夜精品一区二区三区在线视频| 欧美亚洲视频在线看网址| 日韩欧美极品在线观看| 亚洲综合自拍一区| 久久97久久97精品免视看| 亚洲电影成人av99爱色| 欧美激情一区二区久久久| 色综合天天狠天天透天天伊人| 欧美日韩国产va另类| 欧美视频专区一二在线观看| 国产精品视频播放| 爽爽爽爽爽爽爽成人免费观看| 久久精品国产亚洲7777| 孩xxxx性bbbb欧美| 亚洲图片欧美午夜| 国产成人在线亚洲欧美| 亚洲深夜福利在线| 日本精品中文字幕| 欧美在线一区二区视频| 欧美小视频在线| 亚洲成人在线视频播放| 亚洲精品电影在线| 最近2019中文字幕mv免费看| 日韩美女免费视频| 久久精品国产亚洲精品| 欧美激情欧美狂野欧美精品| 国产精品毛片a∨一区二区三区|国| 久久精品免费电影| 国产人妖伪娘一区91| 久久亚洲一区二区三区四区五区高| 日韩av电影在线播放| 国产成人小视频在线观看| 久久久久久久久爱| 91精品久久久久久久久不口人| 久久久亚洲影院| 国产成人在线精品| 97在线观看视频| 亚洲视频一区二区| 欧美一区三区三区高中清蜜桃| 国产精品电影网| 亚洲精品自产拍| 精品国产91乱高清在线观看| 欧美理论在线观看| xx视频.9999.com| 欧美成人精品一区二区| 在线观看精品自拍私拍| 91在线免费网站| 最近2019年中文视频免费在线观看|