在上一章的分享中我们学习了如何动态添加子报表,本文在上节的基础上来分析,如果将子报表的信息保存成JSON字符串后,如何动态添加子报表。
相关博客
ActiveReports 中实现动态加载子报表(1)-基础篇
解析JSON 对象
1. JSON数据示例
string jsondata = @"[ { ""ReportNum"" : ""123456"", ""TotalPage"" : 123, ""ReportId"" : [ 1, 2] }, { ""ReportNum"" : ""123456789"", ""TotalPage"" : 123, ""ReportId"" : [ 2,1,3 ] } ]";
2. 创建对象类来保存Json数据
public class MyReportTemp { public string ReportNum { get; set; } public string TotalPage { get; set; } public int[] ReportId { get; set; } //public List<int> ReportId=new List<int>(); public IList<MyReportTemp> MyReportTemp1 { get; set; } }
3. 解析JSON 函数
使用NewtonSoft.Json 提供的Json解析函数,并将解析后的数组保存起来:
public static MyReportTemp DeserializeToJsonObject(string json) { //解析JSON 数据获取报表信息; MyReportTemp temp = JsonConvert.DeserializeObject<MyReportTemp>(json); return temp; }
4. 通过解析后的报表对象,生成对应的报表
protected void GetReportFromJson(object sender, EventArgs e) { //获取用户的选择值,临时赋值,您可以在修改tempJSONData为实际传进来的值 string tempJsonData= "{ \"ReportNum\": \"123456\", \"TotalPage\" : 123, \"ReportId\" : [ 1, 2, 3,1 ] }"; //解析JSON 数据获取子报表ID; //如果是URL执行 MyReportTemp myReportTemp= DeserializeToJsonObject(tempJsonData); //subreportid=(int[])list.ToArray(typeof(int)); subreportid = myReportTemp.ReportId; ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList(); ////根据子报表ID 从数据库中获取子报表名称; DataTable dt = DBHelper.GetSubReport(subreportid); for (int i = 0; i < dt.Rows.Count; i++) { list1.Add(dt.Rows[i][1]);//获取子报表名称 list2.Add(dt.Rows[i][2]);//获取子报表路径 } //将子报表的名称存储到数组中 subreportName = (string[])list1.ToArray(typeof(string)); //将子报表的路径存储到 subreportPath = (string[])list1.ToArray(typeof(string)); //生成主报表模板对象 rpt = new GrapeCity.ActiveReports.PageReport(new System.IO.FileInfo(Server.MapPath("MasterReport.rdlx"))); rpt.Document.Parameters[0].Values[0].Value = "test"; string[] subparameter = new string[] { "subreport1_p1", "subreport1_p2", "subreport1_p3", "subreport2_p4", "subreport3_p5", "subreport3_p6", "subreport3_p7" }; PageReport rpt1= AddSubReportWithParameter(subreportName, subreportPath, rpt, subparameter); //将报表加载到WebViewer(报表浏览器控件中) this.WebViewer1.Report = rpt1; }
解析JSON Array
测试数据:
string jsondata = @"[ { ""ReportNum"" : ""123456"", ""TotalPage"" : 123, ""ReportId"" : [ 1, 2] }, { ""ReportNum"" : ""123456789"", ""TotalPage"" : 123, ""ReportId"" : [ 2,1,3 ] } ]";
1. 解析JSONArray方法
public static List<T> DeserializeJsonObjectToList<T>(string json) where T : class { JsonSerializer serializer = new JsonSerializer(); StringReader sr = new StringReader(json); object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List<T>)); List<T> list = o as List<T>; return list; }
2. 根据解析的对象来生成对应的子报表
protected void Page_Load(object sender, EventArgs e) { //临时赋值,可以修改为实际传进来的值 string jsondata = @"[ { ""ReportNum"" : ""123456"", ""TotalPage"" : 123, ""ReportId"" : [ 1, 2] }, { ""ReportNum"" : ""123456789"", ""TotalPage"" : 123, ""ReportId"" : [ 2,1,3 ] } ]"; List<MyReportTemp> temp = JsonHelp.DeserializeJsonObjectToList<MyReportTemp>(jsondata); ArrayList listtemp1 = new ArrayList(); ; ArrayList listtemp2 = new ArrayList(); ; string[] subreportNametemp; string[] subreportPath; MyReport = new PageReport[temp.Count]; for (int i = 0; i < temp.Count; i++) { // string masterReportName = temp[i].ReportNum + ".rdlx"; PageReport rpttemp = new GrapeCity.ActiveReports.PageReport(new System.IO.FileInfo(Server.MapPath("MasterReport.rdlx"))); rpttemp.Report.ReportParameters[0].DefaultValue.Values.Add("test123"); int[] tempSubId = temp[i].ReportId; rpttemp.Document.Printer.PrinterName = ""; System.Data.DataTable dt = DBHelper.GetSubReport(tempSubId); for (int j = 0; j < tempSubId.Length; j++) { listtemp1.Add(dt.Rows[j][1]); listtemp2.Add(dt.Rows[j][2]); } //将子报表的名称存储到数组中 subreportNametemp = (string[])listtemp1.ToArray(typeof(string)); ////将子报表路径存储到数组中 subreportPath = (string[])listtemp2.ToArray(typeof(string)); //生成报表 PageReport report = AddSubReport(subreportNametemp, subreportPath, rpttemp); MyReport[i] = report; //导出PDF到客户端 ExportPDF(report, i); listtemp1.Clear(); listtemp2.Clear(); } }
您在使用产品过程中有任何疑问,可以登录葡萄城开发者社区和经验丰富的技术工程师、ActiveReports开发人员交流:了解更多。
了解ActiveReports产品更多特性:
下载产品体验产品功能: