本文来自Torres.Wu发表在博客园的博客,转载请标明出处。

同上一篇差不多,这次咱们加载带有子报表的RDCl文件。首先还是创建一个form程序,在form2窗体中添加一个ReporView控件,load方法如下:

private void Form2_Load(object sender, EventArgs e)
{
DataSet ds3 = new DataSet();
string fileName = System.Configuration.ConfigurationManager.AppSettings["file3"].ToString();
string rptFilePath = System.IO.Path.Combine(Application.StartupPath, fileName);
this.reportViewer1.LocalReport.ReportPath = rptFilePath; this.reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;
try
{
ds3 = getDS3();
}
catch (Exception ex)
{ MessageBox.Show(ex.Message);
}
Microsoft.Reporting.WinForms.ReportDataSource r3 = new Microsoft.Reporting.WinForms.ReportDataSource();
r3.Value = ds3.Tables[];
r3.Name = "DataSet1";
this.reportViewer1.LocalReport.DataSources.Add(r3);
//添加加载子报表事件
this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SubreportProcessingEventHandler);
this.reportViewer1.RefreshReport();
}

大家看到与上一篇不同的是这次在load事件中加了子报表的加载事件,此事件在处理子报表时发生。

同样的,要有主报表数据源和子报表数据源:

 //主报表数据源
DataSet getDS3()
{
string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionSQL"].ToString();
SqlConnection conn = new SqlConnection(connStr);
//读取sql
XmlDocument xmldoc = new XmlDocument();
string fileName = System.Configuration.ConfigurationManager.AppSettings["file3"].ToString();
string rptFilePath = System.IO.Path.Combine(Application.StartupPath, fileName);
xmldoc.Load(rptFilePath);
//this.reportViewer1.LocalReport.ReportPath = rptFilePath; XmlNodeList sqlM = xmldoc.GetElementsByTagName("CommandText");
string sql = sqlM[].InnerXml.ToString();
XmlNodeList canshu = xmldoc.GetElementsByTagName("QueryParameter");
//获取数据源
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
List<string> list = new List<string>();
list.Add("生物科学系");
//如果有参数 传参数
if (canshu.Count > )
{
XmlNodeList canshuList = xmldoc.GetElementsByTagName("ReportParameter");
if (canshuList.Count > )
{
for (int i = ; i < canshuList.Count; i++)
{ da.SelectCommand.Parameters.Add("@" + canshuList[i].Attributes.GetNamedItem("Name").Value, list[i]); //参数传给数据源
ReportParameter rp = new ReportParameter(canshuList[i].Attributes.GetNamedItem("Name").Value, list[i]);
this.reportViewer1.LocalReport.SetParameters(rp); //参数传给报表 }
} }
DataSet de = new DataSet();
da.Fill(de, "Table");
conn.Close();
return de;
}
//子报表数据源
DataSet getDS4()
{
string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionSQL"].ToString();
SqlConnection conn = new SqlConnection(connStr);
//读取sql
XmlDocument xmldoc = new XmlDocument();
string fileName = System.Configuration.ConfigurationManager.AppSettings["file4"].ToString();
string rptFilePath = System.IO.Path.Combine(Application.StartupPath, fileName);
xmldoc.Load(rptFilePath);
XmlNodeList sqlM = xmldoc.GetElementsByTagName("CommandText");
string sql = sqlM[].InnerXml.ToString();
XmlNodeList canshu = xmldoc.GetElementsByTagName("QueryParameter");
//获取数据源
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
List<string> list = new List<string>();
list.Add("生物科学系");
//如果有参数 传参数
if (canshu.Count > )
{
XmlNodeList canshuList = xmldoc.GetElementsByTagName("ReportParameter");
if (canshuList.Count > )
{
for (int i = ; i < canshuList.Count; i++)
{
da.SelectCommand.Parameters.Add("@" + canshuList[i].Attributes.GetNamedItem("Name").Value, list[i]); //参数传给数据源
}
}
}
DataSet de = new DataSet();
da.Fill(de, "Table");
conn.Close();
return de;
}

还有在处理子报表时发生的事件:

        /// <summary>
/// 为子报表加数据源
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void SubreportProcessingEventHandler(object sender, SubreportProcessingEventArgs e)
{
DataSet ds4 = new DataSet();
try
{
ds4 = getDS4();
}
catch (Exception)
{ throw;
}
DataTable dt = ds4.Tables[]; Microsoft.Reporting.WinForms.ReportDataSource r3 = new Microsoft.Reporting.WinForms.ReportDataSource();
r3.Value = ds4.Tables[];
r3.Name = "DataSet1";
e.DataSources.Add(r3);
}本文来自Torres.Wu发表在博客园的博客,转载请标明出处。

这样就大功告成了,配置文件和上一篇一样。

本文来自Torres.Wu发表在博客园的博客,转载请标明出处。

ReportView动态加载带参数的RDCL文件及子报表的更多相关文章

  1. ReportView动态加载带参数的RDCL文件

    在vs里新建一个winform程序"ReportViewTest",在form1中添加一个reportView控件,from1的load事件如下: private void For ...

  2. 为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件

    为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件.样式文件命名格式如:forms[_屏幕宽度].css,样式文件中只需重新定义文本框和下拉框的宽度即可. 在包含的头文件 ...

  3. js实用方法记录-js动态加载css、js脚本文件

    js实用方法记录-动态加载css/js 附送一个加载iframe,h5打开app代码 1. 动态加载js文件到head标签并执行回调 方法调用:dynamicLoadJs('http://www.yi ...

  4. JavaScript 之 动态加载JS代码或JS文件

    2.动态加载JS文件 <script type="text/javascript"> function loadScript(url, callback) { var ...

  5. 使用js加载器动态加载外部js、css文件

    let MiniSite = new Object(); /** * 判断浏览器 */ MiniSite.Browser = { ie: /msie/.test(window.navigator.us ...

  6. 动态加载JS(css)文件

    <script language="javascript">document.write("<script src='test.js'><\ ...

  7. CxImage动态加载图片(判断图片文件类型)

    1.打开一张图可以通过创建一个新的CxImage对象来完成,通过构造函数来打开一张图CxImage::CxImage(const char * filename, DWORD imagetype)其中 ...

  8. 动态加载、移除css文件

    修改样式有通过修改class属性来更改,也可以通过动态引入外部的css文件来改变对应的样式展示. 这里就介绍动态引入.移除css文件 ///添加平板样式文件 function loadStyles() ...

  9. C#,动态加载DLL,通过反射,调用参数,方法,窗体

    .net中常会用到动态加载DLL,而DLL中可能包含各种参数.方法.窗体,如何来调用动态加载这些参数.方法.窗体呢? 在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: System. ...

随机推荐

  1. 控制器没有足够的带宽可利用为USB大容量存储设备的解决方法

    伴随网盘时代的没落,最近刚入手了一个移动硬盘.现在的移动硬盘都是USB3.0,传输速度比USB2.0要快很多.但是链接笔记本电脑后发现传输速度在20MB/s左右,跟USB2.0速度差不多,并不能达到传 ...

  2. Android Acitivy切换平移动画效果实现

    1.在anim目录下新建anim文件夹,新建tran_in.xml和tran_out.xml分别表示下一页切换进入,和本页切换出去. 即in表示下一页向左平移,out表示同样向左平移至消失. tran ...

  3. VUE 框架

    一.什么是vue             它是一个构建用户界面的JAVASCRITPO框架 二.怎么使用VUE (1).引入vue.js 如:<script src='vue.js'>&l ...

  4. [DeeplearningAI笔记]改善深层神经网络_深度学习的实用层面1.10_1.12/梯度消失/梯度爆炸/权重初始化

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.10 梯度消失和梯度爆炸 当训练神经网络,尤其是深度神经网络时,经常会出现的问题是梯度消失或者梯度爆炸,也就是说当你训练深度网络时,导数或坡 ...

  5. 备忘:java在cmd中编译运行

    防止每次用的时候都想不起来 1.进入.java文件所在的路径 (cls清除控制台的命令) 2.javac编译 javac -d . demo1.java javac demo1.java 如所编译的文 ...

  6. Oracle中 in、exists、not in,not exists的比较

    最基本的区别: in 对主表使用索引 exists 对子表使用索引 not in 不使用索引 not exists 对主子表都使用索引 写法: exist的where条件是: "...... ...

  7. spring实例化bean三种方式

    我看了这篇博文<https://www.cnblogs.com/zhanglei93/p/6221546.html>,以及自己实践总结了关于spring实例化bean对象的3种方式. 一. ...

  8. Quartz 任务调度(转)

    原文链接:http://lavasoft.blog.51cto.com/62575/93938 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Qu ...

  9. 没有dev-server.js文件,如何进行后台数据模拟?

    最新的vue-webpack-template 中已经去掉了dev-server.js 但是要进行模拟后台数据的,如何模拟本地数据操作? 解决方法: dev-server.js 改用webpack-d ...

  10. CF 455D. Serega and Fun [分块 deque]

    Serega and Fun 题意: [l,r]循环右移一位,查询区间内某个数出现次数 为什么好多人用链表?反正我是不会写双向链表 完全可以分块然后模拟啊...中间的块只会插入删除一个元素呀....用 ...