C#如何为Telerik Report动态赋值及解决PDF重复分页问题
问题原因及解决方案
出现数百页重复数据大概率是以下几个原因导致,对应解决方法如下:
- 原因1:仅替换了顶级报表的数据源,未覆盖报表内部组件绑定的原有数据源
你当前代码仅给report.DataSource赋值,但如果设计报表时,Detail区域的Table、List、Matrix等数据展示组件单独绑定了原Web数据源(未设置为继承父级数据源),这些组件仍会调用原有数据源拉取数据,和你新注入的数据源叠加触发嵌套渲染,导致数据重复。
解决方法:
要么在报表设计器中将所有数据组件的数据源设置为继承父级,要么直接替换报表内置数据源集合中的原有数据源(更推荐),示例代码:using (var sourceStream = System.IO.File.OpenRead("Reports\\DemoReport.trdp")) { var reportPackager = new ReportPackager(); report = (Report)reportPackager.UnpackageDocument(sourceStream); // 替换原有指定名称的数据源,名称和你设计报表时设置的数据源名称保持一致即可 var targetDatasource = report.DataSources["你原有Web数据源的名称"] as ObjectDataSource; if(targetDatasource != null) { targetDatasource.DataSource = datas; // 直接传List即可,不需要转DataTable } } - 原因2:出现双层嵌套绑定
如果你同时给顶级报表、内部Table/List组件都绑定了同一个100条的数据源,会触发双层循环:顶级数据源每一条数据渲染一次Detail区域,Detail里的Table每次又遍历全部100条数据,最终生成100*100=10000条数据,自然会出现数百页重复内容。
解决方法:
二选一即可:- 保留顶级报表数据源绑定,将内部Table/List的数据源设置为
=ReportItem.DataObject继承父级,不要重复指定数据源 - 清空顶级报表的DataSource,仅给内部的Table/List组件绑定数据源
- 保留顶级报表数据源绑定,将内部Table/List的数据源设置为
- 原因3:DataTable转换异常
你用JSON序列化反序列化的方式把List<WeatherForecast>转DataTable,可能会出现重复行、重复列的异常,Telerik的ObjectDataSource原生支持IEnumerable类型的数据源,不需要额外转DataTable,直接传入你的List集合即可避免转换导致的数据异常。 - 原因4:未清理原有数据源实例
原Web数据源仍存在于report.DataSources集合中,如果报表有分组、子报表等逻辑,可能会同时读取多个数据源的内容叠加渲染。建议替换完目标数据源后,删除集合中多余的旧数据源实例。
内容的提问来源于stack exchange,提问作者mr.saimons
相关产品推荐
相关产品推荐

