Asp.net中动态控制RDLC报表

转载 2006年06月09日 16:50:00
在asp.net程序中,可以选择使用水晶报表,功能确实强大。但是web版的水晶报表好像存在版权的问题。
如果所作报表不是复杂的一塌糊涂的话,可以使用微软自带的Rdlc报表。

已经有老兄做出了不少诠释:http://www.cnblogs.com/waxdoll/
更多资料可以在这里找到:http://www.gotreportviewer.com/

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结构





后记:本文献给我女朋友,当成她的生日礼物。
题外话:其实我一直不太明白所谓“献给”的意思,看那么多作家都是“谨以本文献给xx”,首先我知道他献给的不是版权,应该也不是稿费,如果他要献给的人喜欢还可以,如果人家根本不喜欢看书,这种献给真是没意思了。

http://dlwang2002.cnblogs.com/archive/2006/05/27/410499.html


相关文章推荐

Asp.net 打印页面 局部页面 动态控制

1. window.print(); 打印 即可实现打印 如果要实现页面的局部打印,有两种办法    1).利用style,不需要打印的地方都加上 NoPrint Style ...

Asp.net 动态控制GridView列的显示和隐藏

效果图如下:              说明:当点击Gridview列中的—符号时,该被选列被隐藏掉,自动显示在下边的下拉框中,当选中下拉框中的某列时,该列在    ...

asp.net 2.0下根据权限动态控制菜单、动态配置导航信息 .

一般管理系统往往需要通过权限管理菜单(是否显示,是否Enable),再加上导航树控件TreeView,形成灵活的导航控制方案。      采用MasterPage是一个不错的思路,可以把Menu控...
  • cheug
  • cheug
  • 2012-03-03 10:56
  • 733

asp.net RDLC报表使用(二)

今天较晚了!白天的时候还被自己坑了一下,浪费了不少时间处理一个问题。晚上又拜读了几篇RDLC的文章,觉得自己写的是水平较低的入门级内容,咋办哪!没事,自己的活,就当是个记录。放在这里吧。    ...

Asp.net报表ReportViewer设计(RDLC)

ReportViewer是微软的报表控件,其设计文件为RDLC,数据架构为数据集。效果图如下: 其中序号调用的是内置函数,姓名、收入、所属部门绑定的是数据源,头像绑定的是URL指向的外部图片...

asp.net RDLC报表使用(一)

前言            最近在用VS2005的报表,RDLC报表;对于VS2005的另外一个报表水晶报表,不是微软出品的,而且导出excle的时候不好,我就不太想用,有兴趣的话可以去蜡人张的博客...

asp.net中rdlc报表应用

  • 2008-09-01 14:12
  • 13KB
  • 下载

VB.NET rdlc 报表的使用

在学习vb6时,使用的报表是第三方的Grid++Report,纠结了一番,现在换到了VB.Net,有花了一天的时间来捣鼓。不过感觉还是很有收获,拿出来分享一下。 第一阶段【添加数据集】 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)