ActiveReports 中实现动态加载子报表(2)-使用JSON 数据传递子报表

发布时间:2016/11/30 00:11 发布者:lenka.guo

返回博客中心

在上一章的分享中我们学习了如何动态添加子报表,本文在上节的基础上来分析,如果将子报表的信息保存成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产品更多特性:

/developer/activereports

下载产品体验产品功能:

/download/?pid=16


关于葡萄城

赋能开发者!葡萄城是专业的集开发工具、商业智能解决方案、低代码开发平台于一身的软件和服务提供商,为超过 75% 的全球财富 500 强企业提供服务。葡萄城专注控件软件领域30年,希望通过模块化的开发控件、灵活的低代码应用开发平台等一系列开发工具、解决方案和服务,帮助开发者快速响应复杂多变的业务需求,最大程度地发挥开发者的才智和潜能,让开发者的 IT 人生更从容更美好。

了解详情,请访问葡萄城官网