• ReportView动态加载带参数的RDCL文件及子报表


    本文来自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[0];
                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[0].InnerXml.ToString();
                XmlNodeList canshu = xmldoc.GetElementsByTagName("QueryParameter");
                //获取数据源
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                List<string> list = new List<string>();
                list.Add("生物科学系");
                //如果有参数 传参数
                if (canshu.Count > 0)
                {
                    XmlNodeList canshuList = xmldoc.GetElementsByTagName("ReportParameter");
                    if (canshuList.Count > 0)
                    {
                        for (int i = 0; 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[0].InnerXml.ToString();
                XmlNodeList canshu = xmldoc.GetElementsByTagName("QueryParameter");
                //获取数据源
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                List<string> list = new List<string>();
                list.Add("生物科学系");
                //如果有参数 传参数
                if (canshu.Count > 0)
                {
                    XmlNodeList canshuList = xmldoc.GetElementsByTagName("ReportParameter");
                    if (canshuList.Count > 0)
                    {
                        for (int i = 0; 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[0];
    
                Microsoft.Reporting.WinForms.ReportDataSource r3 = new Microsoft.Reporting.WinForms.ReportDataSource();
                r3.Value = ds4.Tables[0];
                r3.Name = "DataSet1";
                e.DataSources.Add(r3);
            }本文来自Torres.Wu发表在博客园的博客,转载请标明出处。

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

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

  • 相关阅读:
    数组作为函数参数传递时
    Tree 笨方法实现
    双向链表
    带头节点的循环链表及两个循环链表的合并
    josephus问题->不带头节点的循环链表
    数组形式链表
    检测qq是否在线
    Python-requests模块
    Python面向对象练习——基于面向对象设计一个对战游戏
    Python-面向对象
  • 原文地址:https://www.cnblogs.com/wwfjcy479/p/3700630.html
Copyright © 2020-2023  润新知