|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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编译器那么简易。 |
|