zoukankan      html  css  js  c++  java
  • 动态绑定ReportViewer控件之经验总结

    以上两篇文章已经很丰富了,但是照做一遍不行,检查了N遍还是不行,就是找不出问题原因,总是提示“尚未为数据源“DataSet1_DataTable1”提供数据源实例。”这主要是说在为ReportViewer控件选择数据源的时候,还没有选择数据源实例,如图所示

    ,因此要选择一个数据源,例如ObjectDataSource1,这个一般是在你选择的时候自动生成的,但即使选择了数据源也还是会出错,比如“处理报表时出错。未能找到在 ObjectDataSource“ObjectDataSource2”的 TypeName 属性中指定的类型”等类似的错误,因为还差一个关键的步骤,就是配置数据源,我们要先选择业务对象,就是选择预先准备好的DataSet用来当容器(因为我们要把真正从数据库中取出来的数据放进去),

    然后是定义数据方法,这个地方我不知道具体的过程或逻辑应该是怎样的,但我觉得应该返回一个DataSet,于是我就选择了一个Coyp()方法,

    于是就顺利实现了,总结起来就是:

    1、在页面添加ReportViewer控件。

    2、新建一个DataSet文件,设置的字段名要与欲动态绑定的从数据库提取出来的DataSet一样,这个主要是用来当做容器,因为报表文件需要用到数据集文件。

    3、新建报表文件rdlc,选择你想要的报表样式,并将DataSet中的字段拖拽到报表中。

    4、为ReportViewer选择报表,选择数据源,并配置数据源(具体方法如上所述)。

    5、最后就剩下在cs文件中动态指定数据源了,常用代码如下:

                    ReportDataSource rds = new ReportDataSource("DataSet1_DataTable1", dt2);//将从数据库中提取出的DataTable填进DataSet文件中的DataSet1_DataTable1。

                    ReportViewer1.LocalReport.DataSources.Clear();

                    ReportViewer1.LocalReport.DataSources.Add(rds);

                    ReportViewer1.LocalReport.Refresh();

    另外,如果我们需要在同一页面显示不同情况的报表,比如你如果用的是折线图,但取出不同的数据它的刻度就会不同,有的数比较大有的数较小,这样就会影响效果,这种情况就可以制作几个不同的报表,这就真正用到了动态绑定,甚至于还有更强的方法,不用准备更多的报表,每次都让它通过代码生成,例如:

                    ControlCollection coll = ReportViewer1.Parent.Controls;

                    int oldIndex = coll.IndexOf(ReportViewer1);

                    ReportViewer newViewer = new ReportViewer();

                    coll.AddAt(oldIndex, newViewer);

                    coll.Remove(ReportViewer1);

                    newViewer.ShowToolBar = false;

                    newViewer.Width = 795;

                    newViewer.Height = 527;

                    newViewer.LocalReport.DataSources.Clear();

                    newViewer.LocalReport.ReportPath = MapPath("Report1.rdlc");

                    newViewer.LocalReport.ReportEmbeddedResource = "Report1.rdlc";

                    newViewer.LocalReport.DataSources.Add(rds);

                    newViewer.LocalReport.Refresh();

    这个方法的大概意思就是用ControlCollection新建一个ReportViewer的控件集合,再删除已有的ReportViewer1,添加一个新的newViewer,然后指定需要的数据集,个人觉得这个方法更好一些,关于新生成的newViewer的属性一样可以用代码设置。

    注意事项:

    1、ReportViewer控件的样式可以设置,例如我就想要一个报表,不想看见刷新按钮等,这个就可以ShowToolBar设置为False。

    2、实现Refresh在很多时候是必须的,因为已经选择不显示刷新按钮了。但如果你的页面有updatepanel控件就要注意了,这个会影响你的刷新,最好是去掉updatepanel控件。

  • 相关阅读:
    Renderscript 浅析 (三)
    renderscript 浅析(二)
    renderscript 浅析(一)
    小米MACE开源框架搭建
    Word2vec
    最优化算法(牛顿、拟牛顿、梯度下降)
    聚类算法一(Kmeans、层次类聚、谱类聚)
    分类算法三(贝叶斯)
    js 创建方法
    XML与JSON的区别
  • 原文地址:https://www.cnblogs.com/techfans/p/4135696.html
Copyright © 2011-2022 走看看