RDLC一些问题收集
xp下vs2010版的
1.发布时需要独立安装或Copy对应的程序集到客户端电脑
需要Copy的程序集,文件可以从c:\windows\assembly 通过dos命令复制过来。
Microsoft.ReportViewer.Common.dll
Microsoft.ReportViewer.ProcessingObjectModel.dll
Microsoft.ReportViewer.WebForms.dll
Microsoft.ReportViewer.WinForms.dll
或者下载额外安装包:http://www.microsoft.com/en-us/download/details.aspx?id=6442
2.可以使用dataset, 或自定义的数据源如POCO,需要添加下数据源,在RDLC里面都是以Dataset节点显示
一个RDLC 可以定义多个数据源,添加额外数据原时,打开对应报表设计窗口,在菜单[视图]->报表数据(或者按Ctrl+alt+D)
3.固定表头问题
RDLC报表固定每页都显示表头
以XML方式打开rdlc文件
查找到
<TablixRowHierarchy>
<TablixMembers>
<TablixMember>
<KeepWithGroup>After</KeepWithGroup>
</TablixMember>
<TablixMember>
<Group Name="详细信息" />
</TablixMember>
<TablixMember>
<KeepWithGroup>Before</KeepWithGroup>
</TablixMember>
</TablixMembers>
</TablixRowHierarchy>
修改成
<TablixRowHierarchy>
<TablixMembers>
<TablixMember>
<KeepWithGroup>After</KeepWithGroup>
<RepeatOnNewPage>true</RepeatOnNewPage> 加上这句就可以了
</TablixMember>
<TablixMember>
<Group Name="详细信息" />
</TablixMember>
<TablixMember>
<KeepWithGroup>Before</KeepWithGroup>
</TablixMember>
</TablixMembers>
</TablixRowHierarchy>
4.可以通过设置KeepTogether指定将列表不分页显示(打印视图还是要分页的)
5.相关代码

var befMoney = 0.0m; if (string.IsNullOrWhiteSpace(txtCustomer.Text.Trim())) { throw new Exception("必需输入客户名称!"); } //生成报表数据并绑定 var list = new RepManager().Payable(dtpBTime.Value, dtpETime.Value.Date, txtCustomer.Text, out befMoney); bindingSource1.DataSource = list; var repDataSource = new Microsoft.Reporting.WinForms.ReportDataSource("dsRP", bindingSource1); reportViewer1.LocalReport.DataSources.Add(repDataSource); //设置报表模板 this.reportViewer1.LocalReport.ReportEmbeddedResource = "FIStudio.WinUI.Report.RPDetail.rdlc"; //参数设置 var repParams = new ReportParameter[]{ new ReportParameter("Title",string.Format("产品采购明细账--{0}",txtCustomer.Text)), new ReportParameter("BefMoneyTitle",string.Format("{0}前结余",dtpBTime.Text)), new ReportParameter("BefMoney",befMoney.ToString()), new ReportParameter("EndMoneyTitle",string.Format("{0}止结余",dtpETime.Text)), new ReportParameter("FieldA","付款"), new ReportParameter("FieldB","应付结余") }; reportViewer1.LocalReport.SetParameters(repParams); //呈现 this.reportViewer1.RefreshReport();
6.数据源内容变更时可能有缓存
reportViewer1.LocalReport.DataSources.Clear();调用下清空缓存

var equipmentNo = TryParser(txtEquipmentNo.Text, ""); var useCount = TryParser<int?>(txtUseCount.Text, 0) ; var service = new EquipmentServiceImpl(); var response = service.queryBladeUseStatus(equipmentNo, useCount * 10000); DataTable dt = new dsBladeUseStatus.DataTable1DataTable(); foreach (var it in response.Model) { var row = (dsBladeUseStatus.DataTable1Row)dt.NewRow(); row.序号 = it.RecId; row.刀片 = it.BladeNo; row.设备号 = it.EquipmentNo; row.维护人 = it.EditUser; row["最后维护"] = GetV(it.EditTime); row.使用次数 = it.UseCount.HasValue ? it.UseCount.Value.ToString() : ""; row.备注 = ""; dt.Rows.Add(row); } ReportViewer1.LocalReport.DataSources.Clear(); var repDataSource = new Microsoft.Reporting.WebForms.ReportDataSource("ds", dt); ReportViewer1.LocalReport.DataSources.Add(repDataSource); var path = System.Web.Hosting.HostingEnvironment.MapPath("/EM/UI/BladeUseStatusQuery.rdlc"); //设置报表模板 this.ReportViewer1.LocalReport.ReportPath = path; //参数设置 var repParams = new ReportParameter[]{ new ReportParameter("QueryTime",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), new ReportParameter("UseCount",">=" + useCount + "万次"), new ReportParameter("EquipmentNo",equipmentNo) }; ReportViewer1.LocalReport.SetParameters(repParams); this.ReportViewer1.LocalReport.DisplayName = "自动机刀片使用状态"; //呈现 // this.ReportViewer1.DataBind(); ReportViewer1.LocalReport.Refresh(); } catch (Exception ex) { Alert(ex.Message); }
WebForm中,如果不调用清空,则上面代码回导致每查询一次内参中则多一个数据集合(ds)
7.WebForm中使用强类型DataSet时,需要把DataSet放根目录下
------
8.WebForm中无法使用(vs2010--.net4.0 + xp) 自定义类为数据源,只能使用强类型的DataSet
不过绑定数据时,只要字段名称跟DataSet的Table列名对上即可,可以使用List<XXX>类型的数据绑定
另外可以建立一个类库项目,在类库项目里使用自定义类作为报表数据源,在设计完报表后需要把rdlc文件就copy到WebForm项目下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述