Rdlc優(yōu)點:

  1:Rdlc報表設(shè)計簡單

  2: " /> 免费成人小视频,日韩欧美一区二区三区免费观看,美国caopo超碰在线视频

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

ASP.NET中動態(tài)控制RDLC報表

  在ASP.NET程序中,可以選擇使用水晶報表,功能確實強大。但是web版的水晶報表好像存在版權(quán)的問題。如果所作報表不是復(fù)雜的一塌糊涂的話,可以使用微軟自帶的Rdlc報表。

  Rdlc優(yōu)點:

  1:Rdlc報表設(shè)計簡單

  2:結(jié)果存成xml,易于控制

  3:導(dǎo)出格式作的很不錯

  這里所說的動態(tài)控制報表所指的是:在一些時候,制作了報表之后希望在運行中可以動態(tài)的做一些小修改,比如說列的位置,用戶控制顯示那些列等等。

  控制方法,嘗試了這么幾種:

  1:控制微軟提供的報表對象的屬性;

  2:報表全部自動生成

  3:修改報表源文件,然后加載。

  控制微軟提供的報表對象的屬性:基于這個功能需求,一開始我想到的方法是通過控制微軟提供的這些報表對象的屬性來實現(xiàn)。因為這種方法最人道了。但是事與愿違,微軟的ReportViewer對象是用來顯示Report的,自然不行;我使用的report是自己設(shè)計的,localReport,找到Report對象,里面方法有這個幾個:report.GetDefaultPageSettings();report.GetDocumentMap()等,第一個是獲取打印紙張德設(shè)置,第二個是獲取doc文檔(但是始終出錯),都是只讀屬性;所以,第一種嘗試失敗。

  第二種方法就是報表全部自動生成。可以找到一個完整的例子,在這里:http://www.gotreportviewer.com/DynamicTable.zip
這個例子里面,他把xml結(jié)構(gòu)的rdlc報表寫成一個類ReportDefinition,然后通過自定義這個類的內(nèi)容來得到一個報表。其實際還是為了自己構(gòu)造一個報表對象的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;

  但是幾經(jīng)考慮之后,這個方案也不讓人滿意,原因是:所有的報表對象都得自己生成,一下子回到了解放前,沒有可視化工具的設(shè)計既繁瑣又復(fù)雜。特別是如果設(shè)計幾個line,然后再來上幾個分組的話,工作量巨大。

  于是乎嘗試第三種方法:ReportVivwer加載報表前在內(nèi)存中修改報表源文件。這個方法比較狠,其實可以解決很多問題,包括設(shè)計自定義的打印紙張等(這里有另外一種設(shè)置打印紙張的方法http://waxdoll.cnblogs.com/archive/2006/03/03/342435.html)。

  設(shè)計思路是:首先加載rdlc文件到一個XmlDocument對象;然后修改xml內(nèi)容;把xml序列化成字節(jié)流,交給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一段結(jié)構(gòu)

  xml結(jié)構(gòu)

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">

AspNet技術(shù)ASP.NET中動態(tài)控制RDLC報表,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国内精品久久久久影院男同志 | 果冻传媒在线观看完整版免费 | 国模精品一区二区三区视频 | 小黄文污到你湿 | 精品人伦一区二区三区潘金莲 | 嗯啊快停下我是你老师啊H 嗯啊快拔出来我是你老师视频 | 依恋影院在线观看 | 免费可以看黄的视频s色 | 暖暖日本手机免费完整版在线观看 | 国产午夜久久影院 | 国产午夜电影院 | 中文字幕午夜福利片 | 午夜性色一区二区三区不卡视频 | 最新国产精品视频免费看 | 色偷偷爱偷偷要 | 国产福利一区二区精品 | jjzzz日本| 好爽胸大好深好多水 | 男女午夜性爽快免费视频不卡 | 欧美精品熟妇乱 | 成年人视频在线免费观看 | 亚洲AV国产国产久青草 | 欧美激情久久久久久久大片 | 免费啪视频观试看视频 | 亚洲精品国产熟女久久久 | 成年人国产视频 | 江苏电台在线收听 | 国产精品成人免费视频99 | 久久国语露脸精品国产 | 亚洲精品国产字幕久久vr | 人人超碰97caoporen国产 | 湖南电台在线收听 | 最近日本字幕免费高清 | 不知火舞vs精子 | 日韩欧美1区 | 91九色视频无限观看免费 | 亚洲成人欧美 | 中文字幕精品AV内射夜夜夜 | 一边亲着一面膜下的免费过程 | 日本xxxx96| 影888午夜理论不卡 樱桃熟了A级毛片 |