如何动态传递参数到DevExpress XtraReports
1、xtraReport有两种类型的参数Parameter和datasource。关于parameter与datasource的区别
1.1、如果您一个report之需要一份参数,那么可以直接使用Parameter,如果您想要传递一个List<object>那么只能使用数据源的方式传参
1.2、如果使用Parameter的方式,report.Parameters[0].value = "xxx"就可以了,下面我们重点讨论使用数据源的方式
2、怎样使用数据源传递List<object>
xtraReports参数支持IList接口的类型的参数,但是官方给出了答复List<dynamic>类型暂时不支持,所以List<Type>中的Type必须是存在的类型,您如果可以定义所有reports的参数的Type,就可以通过动态修改Type的类型实现动态参数了。
xtraReport参数支持数据链接,以及数据链接的查询结果DataSet。但是官方给出了答复。在序列化的时候,你所定义的数据链接类或者是DataSet,不会一起持久化。所以给xtraReport定义DataSet类型的参数的话,需要您自己额外写代码来保存每个xtraReport的参数
而且DataSet的参数的访问方式为 TableName.PropertyName.这种类型的参数是没有办法随xtraReports一起保存的。使用DataSet可以实现,但是数据源参数无法保存。
3、如何动态传递数据源类型参数给XtraReports
如果你是devexpress19版,那么dev直接支持json类型的参数,免谈
如果您是16版左右的,这里可以使用C#动态创建类来实现。List<Type>中的Type必须是存在的类型是么?那我就发现这个报表参数类型不存在就动态创建。
怎么创建?参考:DynamicClass
如果该xtraReport对应的参数再内存种不存在
Type @class = ClassFactory.Instance.Create(properties);
TypeDic[type] = @class;缓存类型信息
直接使用List<dynamic> datasource作为数据源
List里面存放var instance = (dynamic)Activator.CreateInstance(@class);
亲测可用