仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 788|回复: 9
打印 上一主题 下一主题

[学习教程] ASP.NET网页设计ASP.NET中静态把持RDLC报表

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:31:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
捆绑编译器。用户不需要受制于厂家,自己就能将程序在新平台上编译运行。除了牛B轰轰的linux,估计也没有系统捆绑c/c++的编译器,而且许多新平台都无法支持复杂的c/c++编译器在上面直接运行。asp.net|静态|把持  在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(newReportDataSource("MyData",m_dataSet.Tables[0]));
this.reportViewer1.RefreshReport();这是主动天生xml的代码:
privateMemoryStreamGenerateRdl(List<string>allFields,List<string>selectedFields)
{
 MemoryStreamms=newMemoryStream();
 RdlGeneratorgen=newRdlGenerator();
 gen.AllFields=allFields;
 gen.SelectedFields=selectedFields;
 gen.WriteXml(ms);
 ms.Position=0;
 returnms;
}

  这是完整ReportDefinition的一部分界说:

namespaceRdl{
 usingSystem.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)]
 publicpartialclassReport{
  privateobject[]itemsField;

  可是几经思索以后,这个计划也不让人中意,缘故原由是:一切的报表工具都得本人天生,一会儿回到懂得放前,没有可视化工具的计划既烦琐又庞大。出格是假如计划几个line,然后再来上几个分组的话,事情量伟大。

  因而乎实验第三种办法:ReportVivwer加载报表前在内存中修正报表源文件。这个办法对照狠,实在能够办理良多成绩,包含计划自界说的打印纸张等(这里有别的一种设置打印纸张的办法http://waxdoll.cnblogs.com/archive/2006/03/03/342435.html)。

  计划思绪是:起首加载rdlc文件到一个XmlDocument工具;然后修正xml内容;把xml序列化成字撙节,交给ReportViewer显现。

  这是这一段代码:

publicMemoryStreamGenerateRdlc()
{
 XmlDocumentsourceDoc=newXmlDocument();
 stringpath=AppDomain.CurrentDomain.BaseDirectory+"Test/OrderList.rdlc";
 sourceDoc.Load(path);
 HashtablereportColumns=GetReportColumns(sourceDoc.LastChild);
 //justremove
 for(inti=0;i<reportColumns.Count;i++)
 {
  if(!FindReportCoulmns(reportColumns[i].ToString()))
  {
   RemoveColumnFromRdlc(sourceDoc.LastChild,i);
  }
 }

 MemoryStreamms=newMemoryStream();
 XmlSerializerserializer=newXmlSerializer(typeof(XmlDocument));
 serializer.Serialize(ms,sourceDoc);
 ms.Position=0;
 returnms;
}
  至于怎样GetReportColumns和RemoveColumnFromRdlc,那就很复杂了,就是一个操纵xml工具的历程。例如说:

privateHashtableGetReportColumns(XmlNoderoot)
{
 Hashtablecols=newHashtable();
 //XmlNamespaceManagers=newXmlNamespaceManager(
  XmlNodecells=FindChildNode(root,"Body/ReportItems/Table/Header/TableRows/TableRow/TableCells");
 for(inti=0;i<cells.ChildNodes.Count;i++)
 {
  XmlNodecell=FindChildNode(cells.ChildNodes[i],"ReportItems/Textbox/DataElementName");
  cols[i]=cell.InnerText;
 }
 returncols;
}
  这是利用这一段的代码:

this.ReportViewer1.LocalReport.LoadReportDefinition(this.Report.GenerateRdlc());
this.ReportViewer1.LocalReport.DataSources.Add(newReportDataSource("DataSet1",result.Tables[0]));
this.ReportViewer1.LocalReport.Refresh();
  这个办法终究乐成了。

  附:rdlc文件的xml一段布局

  xml布局

1<?xmlversion="1.0"encoding="utf-8"?>
2<Reportxmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
3<DataSources>
4<DataSourceName="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<ChartName="chart1">有理由相信是能提供更出色的性能。很多平台无法支持复杂的编译器,因此需要二次编译来减少本地编译器的复杂度。当然可能做不到java编译器那么简易。
谁可相欹 该用户已被删除
沙发
发表于 2015-1-19 15:59:57 | 只看该作者
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
第二个灵魂 该用户已被删除
板凳
发表于 2015-1-24 14:01:22 | 只看该作者
Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!
小魔女 该用户已被删除
地板
发表于 2015-2-1 16:31:36 | 只看该作者
网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!
蒙在股里 该用户已被删除
5#
发表于 2015-2-7 08:48:23 | 只看该作者
网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!
再现理想 该用户已被删除
6#
发表于 2015-2-21 10:32:58 | 只看该作者
PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-6 20:07:49 | 只看该作者
Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!
金色的骷髅 该用户已被删除
8#
发表于 2015-3-13 08:08:35 | 只看该作者
当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。
小妖女 该用户已被删除
9#
发表于 2015-3-13 08:08:35 | 只看该作者
但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。
灵魂腐蚀 该用户已被删除
10#
发表于 2015-3-20 17:05:57 | 只看该作者
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 20:50

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表