本文来自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); Listlist = new List (); 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 list = new List (); 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; }
还有在处理子报表时发生的事件:
////// 为子报表加数据源 /// /// /// 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发表在博客园的博客,转载请标明出处。