最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET中動(dòng)態(tài)控制RDLC報(bào)表

 更新時(shí)間:2006年09月28日 00:00:00   作者:  
  在asp.net程序中,可以選擇使用水晶報(bào)表,功能確實(shí)強(qiáng)大。但是web版的水晶報(bào)表好像存在版權(quán)的問(wèn)題。如果所作報(bào)表不是復(fù)雜的一塌糊涂的話(huà),可以使用微軟自帶的Rdlc報(bào)表。

  Rdlc優(yōu)點(diǎn):

  1:Rdlc報(bào)表設(shè)計(jì)簡(jiǎn)單

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

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

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

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

  1:控制微軟提供的報(bào)表對(duì)象的屬性;

  2:報(bào)表全部自動(dòng)生成

  3:修改報(bào)表源文件,然后加載。

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

  第二種方法就是報(bào)表全部自動(dòng)生成??梢哉业揭粋€(gè)完整的例子,在這里:http://www.gotreportviewer.com/DynamicTable.zip
這個(gè)例子里面,他把xml結(jié)構(gòu)的rdlc報(bào)表寫(xiě)成一個(gè)類(lèi)ReportDefinition,然后通過(guò)自定義這個(gè)類(lèi)的內(nèi)容來(lái)得到一個(gè)報(bào)表。其實(shí)際還是為了自己構(gòu)造一個(gè)報(bào)表對(duì)象的xml。這是加載自定義報(bào)表的過(guò)程: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();這是自動(dòng)生成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)考慮之后,這個(gè)方案也不讓人滿(mǎn)意,原因是:所有的報(bào)表對(duì)象都得自己生成,一下子回到了解放前,沒(méi)有可視化工具的設(shè)計(jì)既繁瑣又復(fù)雜。特別是如果設(shè)計(jì)幾個(gè)line,然后再來(lái)上幾個(gè)分組的話(huà),工作量巨大。

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

  設(shè)計(jì)思路是:首先加載rdlc文件到一個(gè)XmlDocument對(duì)象;然后修改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,那就很簡(jiǎn)單了,就是一個(gè)操作xml對(duì)象的過(guò)程。比方說(shuō):

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

  這個(gè)方法終于成功了。

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

相關(guān)文章

  • asp.net通過(guò)動(dòng)態(tài)加載不同CSS實(shí)現(xiàn)多界面

    asp.net通過(guò)動(dòng)態(tài)加載不同CSS實(shí)現(xiàn)多界面

    這篇文章主要介紹了asp.net通過(guò)動(dòng)態(tài)加載不同CSS實(shí)現(xiàn)多界面,需要的朋友可以參考下
    2014-12-12
  • 如何合并多個(gè) .NET 程序集

    如何合并多個(gè) .NET 程序集

    這篇文章主要介紹了如何合并多個(gè) .NET 程序集的方法,大家可能都聽(tīng)說(shuō)過(guò)項(xiàng) ILMerge, SmartAssembly, 等這樣的工具.但是我想如果我們就能通過(guò)在編譯時(shí)將所有這些源代碼文件導(dǎo)入一個(gè)項(xiàng)目,來(lái)獲得這些東西的一個(gè)完美組合.下面我們就來(lái)仔細(xì)探討下。
    2015-03-03
  • asp.net身份驗(yàn)證方式介紹

    asp.net身份驗(yàn)證方式介紹

    asp.net提供了3種認(rèn)證方式: windows身份驗(yàn)證, Forms驗(yàn)證和Passport驗(yàn)證
    2012-06-06
  • 一個(gè)合格的程序員應(yīng)該讀過(guò)哪些書(shū)(偏java)

    一個(gè)合格的程序員應(yīng)該讀過(guò)哪些書(shū)(偏java)

    編者按:2008年8月4日,StackOverflow 網(wǎng)友 Bert F 發(fā)帖提問(wèn):哪本最具影響力的書(shū),是每個(gè)程序員都應(yīng)該讀的
    2013-04-04
  • sqlserver 批量數(shù)據(jù)替換助手V1.0版發(fā)布

    sqlserver 批量數(shù)據(jù)替換助手V1.0版發(fā)布

    前段時(shí)間網(wǎng)站被掛馬,數(shù)據(jù)庫(kù)表中很多文本字段都被加上了一段js腳本。修復(fù)完程序漏洞之后便開(kāi)始著手清理這些被注入的數(shù)據(jù),其間參考了一些網(wǎng)上的方法,大都是寫(xiě)一個(gè)存儲(chǔ)過(guò)程進(jìn)行一個(gè)表一個(gè)表逐一清理。
    2011-10-10
  • asp.net動(dòng)態(tài)獲取Excel表名的函數(shù)代碼

    asp.net動(dòng)態(tài)獲取Excel表名的函數(shù)代碼

    asp.net動(dòng)態(tài)獲取Excel表名的函數(shù)代碼,需要的朋友可以參考下。
    2011-02-02
  • 輕量級(jí)ORM框架Dapper應(yīng)用之實(shí)現(xiàn)CURD操作

    輕量級(jí)ORM框架Dapper應(yīng)用之實(shí)現(xiàn)CURD操作

    這篇文章介紹了使用Dapper實(shí)現(xiàn)CURD操作的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • .NET發(fā)送郵件的實(shí)現(xiàn)方法示例

    .NET發(fā)送郵件的實(shí)現(xiàn)方法示例

    這篇文章主要給大家介紹了關(guān)于.NET發(fā)送郵件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.net具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • LINQ重寫(xiě)博客垃圾圖片回收算法

    LINQ重寫(xiě)博客垃圾圖片回收算法

    本人博客后臺(tái)管理模塊有個(gè)功能,可以?huà)呙鑸D片上傳文件夾下所有未被引用的博客
    2012-02-02
  • ASP.NET MVC分頁(yè)問(wèn)題解決

    ASP.NET MVC分頁(yè)問(wèn)題解決

    這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC分頁(yè)問(wèn)題的解決方法,Ajax.Pager分頁(yè)的使用注意事項(xiàng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01

最新評(píng)論

三门峡市| 弥渡县| 利川市| 齐河县| 浑源县| 营口市| 梧州市| 灌云县| 安达市| 兰溪市| 侯马市| 郎溪县| 罗源县| 塔河县| 富平县| 法库县| 东阳市| 大厂| 东丰县| 平顺县| 平乡县| 资中县| 琼海市| 磴口县| 丽水市| 平武县| 栖霞市| 响水县| 双峰县| 金门县| 子洲县| 盱眙县| 博白县| 克什克腾旗| 西林县| 酉阳| 长寿区| 澜沧| 卓资县| 辰溪县| 浦江县|