C# WinForm中如何将主窗体文本框值传入Report1.rdlc文本框
解决VS2010中WinForms文本框值传入RDLC报表的问题
没问题,我帮你一步步搞定这个传值需求,在VS2010的C# WinForms环境下操作很清晰,咱们分步骤来:
第一步:给RDLC报表添加对应参数
首先得让报表“知道”要接收哪些值,所以先给Report1.rdlc定义参数:
- 打开你的Report1.rdlc报表文件
- 在报表空白处右键,选择报表参数
- 在弹出的窗口里,点击添加按钮,依次创建四个参数:
- 参数名称:
p_SerialNo(注意大小写要和后面代码一致),数据类型选字符串 - 参数名称:
p_TypeNo,数据类型字符串 - 参数名称:
p_Date,数据类型字符串 - 参数名称:
p_TestEngineer,数据类型字符串
- 参数名称:
- 点击确定保存参数设置
接下来把报表里的文本框和这些参数绑定:
- 选中报表里需要显示对应值的文本框,右键选择表达式
- 在表达式窗口里输入对应的参数引用,比如要显示SerialNo的文本框就输入:
=Parameters!p_SerialNo.Value - 其他文本框同理,分别绑定对应的参数后保存报表
第二步:在主窗体中编写代码传递参数
假设你的主窗体有一个触发打印的按钮(比如btn_Print),咱们在它的点击事件里写逻辑,把文本框的值传到带ReportViewer的打印窗体:
方法一:直接在主窗体中设置ReportViewer参数
首先确保打印窗体(比如叫PrintForm)里的ReportViewer1控件的Modifiers属性设为Public(在PrintForm的设计视图里选中ReportViewer1,在属性窗口找Modifiers改成Public),然后在主窗体的按钮点击事件里写:
private void btn_Print_Click(object sender, EventArgs e) { // 实例化打印窗体 PrintForm printForm = new PrintForm(); // 获取ReportViewer的本地报表对象 LocalReport localReport = printForm.ReportViewer1.LocalReport; // 指定报表的嵌入资源路径(替换成你项目的命名空间,比如你的项目叫TestReportApp,就是TestReportApp.Report1.rdlc) localReport.ReportEmbeddedResource = "你的项目命名空间.Report1.rdlc"; // 创建参数集合,把主窗体文本框的值传进去 List<ReportParameter> reportParams = new List<ReportParameter>(); reportParams.Add(new ReportParameter("p_SerialNo", tb_SerialNo.Text.Trim())); reportParams.Add(new ReportParameter("p_TypeNo", tb_TypeNo.Text.Trim())); reportParams.Add(new ReportParameter("p_Date", tb_Date.Text.Trim())); reportParams.Add(new ReportParameter("p_TestEngineer", tb_TestEngineer.Text.Trim())); // 给报表设置参数 localReport.SetParameters(reportParams); // 刷新报表,确保参数生效 printForm.ReportViewer1.RefreshReport(); // 显示打印窗体 printForm.ShowDialog(); }
方法二:在打印窗体中写公共方法接收参数(更规范)
如果不想把ReportViewer设为Public,推荐在PrintForm里写一个公共方法来处理参数:
在PrintForm的代码文件里添加:
public void LoadReportWithParameters(string serialNo, string typeNo, string date, string testEngineer) { // 确认ReportViewer的ProcessingMode是Local(默认应该是,可在属性窗口检查) ReportViewer1.ProcessingMode = ProcessingMode.Local; // 指定报表路径 LocalReport localReport = ReportViewer1.LocalReport; localReport.ReportEmbeddedResource = "你的项目命名空间.Report1.rdlc"; // 创建并设置参数 List<ReportParameter> reportParams = new List<ReportParameter>(); reportParams.Add(new ReportParameter("p_SerialNo", serialNo)); reportParams.Add(new ReportParameter("p_TypeNo", typeNo)); reportParams.Add(new ReportParameter("p_Date", date)); reportParams.Add(new ReportParameter("p_TestEngineer", testEngineer)); localReport.SetParameters(reportParams); ReportViewer1.RefreshReport(); }
然后主窗体的按钮点击事件里调用这个方法:
private void btn_Print_Click(object sender, EventArgs e) { PrintForm printForm = new PrintForm(); // 传递主窗体文本框的值 printForm.LoadReportWithParameters( tb_SerialNo.Text.Trim(), tb_TypeNo.Text.Trim(), tb_Date.Text.Trim(), tb_TestEngineer.Text.Trim() ); printForm.ShowDialog(); }
注意事项
- 报表参数的名称要和代码里的完全一致,包括大小写,否则参数无法传递
- 确认报表的嵌入资源路径正确:可以在Report1.rdlc的属性窗口里看“嵌入的资源”的值,直接复制过来用
- 如果ReportViewer没有显示报表,检查ProcessingMode是否设为Local,报表路径是否正确
这样操作后,主窗体文本框里的值就能准确显示到RDLC报表对应的位置了,要是有细节问题随时提!
内容的提问来源于stack exchange,提问作者User0804




