C#+WINFORM用REPORTVIEWER控件制作报表

转载地址https://blog.csdn.net/langwen2048/article/details/81104543

之前也做过报表,因为内容比较简单,就直接用Label和Textbox控件组合画出报表,还添加了PrintDialog打印控件用来打印报表,效果如下图:
在这里插入图片描述
代码核心是:将你想要打印的内容绘制到 PrintDocument对象上去,并单击该对象的PrintPage事件

 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
            Bitmap _NewBitmap = new Bitmap(panel1.Width, panel1.Height);
            panel1.DrawToBitmap(_NewBitmap, new Rectangle(0, 0, _NewBitmap.Width, _NewBitmap.Height));
            e.Graphics.DrawImage(_NewBitmap, 0, 0, _NewBitmap.Width, _NewBitmap.Height);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

但是后来遇到复杂的报表上面那种方法就不合适了,看到工具箱里有ReportViewer报表控件,就试着用了用。在网上查阅一番,的确可以完成的需求,但是介绍的很少,都很片面,不够详细,折腾我不少时间。其实我希望能有那种傻瓜式的,教我下一步、下一步,下面我尽量把步骤写的详细一些:

添加数据集

右键项目,选择添加新建项,数据——数据集——添加:
在这里插入图片描述
进入DataSet1.xsd中后,在空白处右键,添加-数据表。可以右键数据表添加列,或者通过Ctrl+L快速添加列,数据表名和列名都是可以通过鼠标点击直接修改。
在这里插入图片描述

制作报表

右键项目,添加新项——Reporting——报表——添加
在这里插入图片描述
进入ReportForm.rdlc中,点击空白处,查看属性-主体-设置Size:Width = 6.646in,Height = 10.052in.在报表空白处右键-插入-文本框。双击文本框可直接输入文字,选中文本框-右键-文本框属性,可调整文本大小、字体、对齐等。
在这里插入图片描述
空白处右键-插入-矩阵,会自动跳出数据集属性对话框。名称可以修改,这个很重要,等后面对数据集填充数据时要用到;数据源选刚才上面添加的数据集,可用数据集系统会自动选定 可用的。
在这里插入图片描述
点击确定后会出现一个矩阵,你可以通过插入列和行来设计你的表格。有时候需要合并单元格,选中几个单元格右键,弹出菜单选中 合并单元格;但正常是没有 合并单元格那项的,我总结的是:组内部右侧插入列后,就会出现。每个单元格既可以作为文本框输入文本,而且每个单元格右上角有个小菜单,点击小菜单就可以选择数据集中的字段。
在这里插入图片描述
通过内置表达式获取打印时间
在这里插入图片描述
在这里插入图片描述

添加报表界面

右键项目添加新项,选Visual C# 项-Windows窗体
在这里插入图片描述
选择工具箱中报表-ReportViewer控件,拖入WebPrintOrder.cs界面中
在这里插入图片描述
选择ReportVierwer控件右上角黑色小三角,显示“ReportViewer任务”,选择”在父容器中停靠“;选择报表选择 刚才上面制作的report2.rdlc,reportViewer1的ZoomPercent属性设为75。
在这里插入图片描述

添加数据源

通过数据集添加数据
在WebPrintOrder.cs代码设计界面中,为矩阵的数据集DataSet1添加数据,我的数据是通过界面的构造函数传过来的然后直接赋值,也可以直接SQL server条件查询语句将查询结果直接填充。

private void WebPrintOrder_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
 
    //定义本地数据表的列,名称应跟之前所建的testDataTable表中列相同。
 
    dt.Columns.Add("Time", typeof(DateTime));
    dt.Columns.Add("Distance", typeof(String));
    dt.Columns.Add("Layer", typeof(String));
    dt.Columns.Add("FID", typeof(Int32));
    dt.Columns.Add("Strength", typeof(Int32 ));
    dt.Columns.Add("UserName", typeof(String));
    //动态生成一些测试用数据
           
    DataRow row = dt.NewRow();
    row[0] = time;
    row[1] = "管长 "+Distance.ToString ()+"米处";
    row[2] = Layer;
    row[3] = FID;
    row[4] = 4;
    row[5] = Login.username+"admin";
    dt.Rows.Add(row);
           
    //设置本地报表,使程序与之前所建的testReport.rdlc报表文件进行绑定.
    this.reportViewer1.LocalReport.ReportPath = "Report.report2.rdlc";
    this.reportViewer1.LocalReport.DataSources.Clear();
    this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", dt));
       
    this.reportViewer1.RefreshReport();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

通过设置参数添加数据
在report2.rdlc的报表数据中,右击参数-添加参数,设置参数名称和数据类型
在这里插入图片描述
在这里插入图片描述
在矩阵的单元格文本框属性中,将参数值赋值给单元格。
在这里插入图片描述
在WebPrintOrder.cs代码设计界面中,通过代码为参数赋值。

private void reportViewer1_Load(object sender, EventArgs e)
{
      reportViewer1.ShowParameterPrompts = true;
      ReportParameter p = new ReportParameter("StartTime", DateTime.Now.ToString("F"));
 
      this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { p });
      this.reportViewer1.RefreshReport();     
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行结果
在这里插入图片描述

posted @   林新i  阅读(1709)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2020-11-26 如何获取List<string>里面的数据循环出来
点击右上角即可分享
微信分享提示