找回密码
 立即注册

QQ登录

只需一步,快速开始

KearneyKang 讲师达人认证 悬赏达人认证
超级版主   /  发表于:2020-1-20 16:06  /   查看:6341  /  回复:8
使用JSviewe进行报表展示的时候,经常为了安全性的考虑和前后端分离的考虑,会在使用动态数据源的绑定。
使用动态数据源的绑定很重要一点就是如何进行数据的筛选也就是如何在Startup方法里获取页面的传输进来的参数值。这个办法的实现有两种办法
第一种是使用参数报表,然后再在Startup这个类文件中使用这句代码来实现: var name = args.Parameters[0].Value.ToString(); //获取报表参数   
具体的你可以参考这个博客来详细了解:https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=57898&extra=page%3D2
现在来详细说说第二种实现办法:
这个办法其实跟H5的方法类似都是通过页面端的:reportID来进行一个值的传输
简单的点来说,就是通过 reportID:来进行参数值和报表名称的传递,然后在Startup方法中进行是要Split函数进行一个分割来实现参数和报表名称的分割这样来达到最后想要实现的效果:通过页面端传入的值进行一个数据的筛选。
具体实现如下:
前端代码:
  1. <script type="text/javascript">
  2.     var viewer = GrapeCity.ActiveReports.JSViewer.create({
  3.         element: '#viewerContainer',
  4.         id: 'SalesDetail.rdlx' + ';' + $("#TextBox1").val()+';' + $("#TextBox2").val()  //报表名称和参数的传递
  5.         availableExports: ['Xml', 'Pdf'],
  6.         reportService: {}
  7.         
  8.     });
  9. </script>
复制代码
后端代码:

使用UseCustomStore的方法进行报表名称和参数的获取和分割
  1. public class Startup1
  2.     {
  3.         public static string EmbeddedReportsPrefix = "JSdatasource";
  4.         string ReportName = "";
  5.         public object GetReport(string P)//获取报表名称和报表参数,进行一个对应的报表名称和参数的分割
  6.         {
  7.             string reportName = P.Split(';')[0];//报表名称;
  8.             string parameter1 = P.Split(';')[1];//参数1,这样就可以根据参数值进行数据的筛选了;
  9.             string parameter2 = P.Split(';')[2];//参数2;
  10.             PageReport rep=new PageReport();
  11.             
  12.             string path = System.Web.Hosting.HostingEnvironment.MapPath("~/");
  13.             rep.Load(new FileInfo(@"" + path + "Reports/" + reportName));
  14.             return rep.Report;
  15.         }
  16.       
  17.         public void Configuration(IAppBuilder app)
  18.         {
  19.             app.UseReporting(settings =>
  20.             {

  21.                 settings.UseCompression = true;
  22.                 settings.UseCustomStore(GetReport);//使用UseCustomStore来自定义一些需要的值
  23.                 settings.LocateDataSource = args =>
  24.                 {
  25.                     DataTable dt = new DataTable();
  26.                     string name = ReportName;
  27.                     if (args.DataSet.Query.DataSourceName == "DataSource1")
  28.                     {
  29.                         string a = args.Report.Name.ToString();   //get Report name
  30.                         if (args.DataSet.Name == "DataSet2")
  31.                         {
  32.                             name = args.Parameters[0].Value.ToString();
  33.                             dt.Columns.Add("产品编号");
  34.                             dt.Columns.Add("产品名称");
  35.                             dt.Columns.Add("单价");
  36.                             dt.Columns.Add("库存量");
  37.                             dt.Columns.Add("产地");
  38.                             dt.Rows.Add("A001", "苹果", 10, 300, "中国");
  39.                             dt.Rows.Add("A002", "葡萄", 20, 200, "中国");
  40.                             dt.Rows.Add("A003", "香蕉", 30, 400, "中国");
  41.                             dt.Rows.Add("A004", "甘蔗", 10, 300, "中国");
  42.                             dt.Rows.Add("A005", "荔枝", 20, 200, "中国");
  43.                             dt.Rows.Add("A006", "芒果", 30, 400, "中国");
  44.                             dt.Rows.Add("A007", "猕猴桃", 110, 300, "中国");
  45.                             dt.Rows.Add("A008", "柠檬", 210, 200, "中国");
  46.                             dt.Rows.Add("A009", "栗子", 320, 400, "中国");
  47.                             dt.Rows.Add("A010", "火龙果", 100, 300, "中国");
  48.                             dt.Rows.Add("A011", "青芒", 250, 200, "中国");
  49.                             dt.Rows.Add("A012", "巴旦木", 320, 200, "中国");
  50.                             dt.Rows.Add("A013", "土豆", 380, 400, "中国");
  51.                             dt.Rows.Add("A014", "苹果", 110, 300, "中国");
  52.                             dt.Rows.Add("A015", "葡萄", 420, 200, "中国");
  53.                             dt.Rows.Add("A016", "香蕉", 530, 400, "中国");
  54.                             dt.Rows.Add("A017", "土豆", 380, 400, "中国");
  55.                             dt.Rows.Add("A018", "苹果", 110, 300, "中国");
  56.                             dt.Rows.Add("A019", "葡萄", 420, 200, "中国");
  57.                             dt.Rows.Add("A020", "香蕉", 530, 400, "中国");
  58.                             dt.Rows.Add("A021", "苹果", 10, 300, "中国");
  59.                             dt.Rows.Add("A022", "葡萄", 20, 200, "中国");
  60.                             dt.Rows.Add("A023", "香蕉", 30, 400, "中国");
  61.                             dt.Rows.Add("A024", "甘蔗", 10, 300, "中国");
  62.                             dt.Rows.Add("A025", "荔枝", 20, 200, "中国");
  63.                             dt.Rows.Add("A026", "芒果", 30, 400, "中国");
  64.                         }
  65.                     }
  66.                     return dt;
  67.                 };


  68.             });

  69.         }


  70.     }

复制代码



8 个回复

倒序浏览
kgxk
注册会员   /  发表于:2021-9-22 08:57:03
推荐
可以不在Startup文件中实现动态数据绑定吗,希望实在控制器中
回复 使用道具 举报
qcsoft
金牌服务用户   /  发表于:2020-6-19 18:48:06
沙发
LocateDataSource  没被调用会是什么原因呢?
回复 使用道具 举报
KearneyKang讲师达人认证 悬赏达人认证
超级版主   /  发表于:2020-6-22 18:16:20
板凳
已经回复了,这是你同时使用了这两个方法,然后不知道是具体执行两个方法导致的
回复 使用道具 举报
gxfmmm
注册会员   /  发表于:2020-7-13 18:40:15
地板
假设动态数据源的字段都不一样。就是按请求参数 多个数据源 切换的GETreport怎么写
回复 使用道具 举报
gxfmmm
注册会员   /  发表于:2020-7-13 18:50:10
5#
gxfmmm 发表于 2020-7-13 18:40
假设动态数据源的字段都不一样。就是按请求参数 多个数据源 切换的GETreport怎么写

我需要实现的是前台JSVEIW传来一个参数,读取到一个结果集,然后再前端展现。 结果集的字段不一样。也存在N个结果集可能,一直可能在新加(按ID读取数据库配置的SQL作为结果集)
回复 使用道具 举报
KearneyKang讲师达人认证 悬赏达人认证
超级版主   /  发表于:2020-7-14 17:56:50
6#
你好,使用JSviewer是可以通过前端传递参数值在Startup.CS的方法里进行数据 筛选的,有两种办法第一种就是上面说的办法,还有一种是使用参数报表,在后端获取 参数的值进行筛选
但是具体的操作还是要详细根据你的当前业务场景进行实现
回复 使用道具 举报
杭州昱恒科技
初级会员   /  发表于:2022-4-22 13:36:14
8#
kgxk 发表于 2021-9-22 08:57
可以不在Startup文件中实现动态数据绑定吗,希望实在控制器中

对啊,怎么能在startup里去做报表路由呢
回复 使用道具 举报
Bella.YuanWyn认证
超级版主   /  发表于:2022-4-22 18:16:07
9#
杭州昱恒科技 发表于 2022-4-22 13:36
对啊,怎么能在startup里去做报表路由呢

您好,Startup相当于一个中间层,目前只能这样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部