近日由于项目需要,需要做一个报表功能,找了N多资料,最后还是觉得就用以前在VB.NET上用过的ReportViewer控件来完成。但是发现,VS2019居然没有这个控件,下面把安装控件和控件使用方面的经验记录再此。

文章目录

  • 1. 下载安装
    • 1.1 通过NuGet下载相关包。
    • 1.2 安装报表设计器
  • 2. 报表设计
    • 2.1 添加1个报表
    • 2.2 设计报表
      • 2.2.1 页面设置
      • 2.2.2 添加页眉页脚
      • 2.2.3 插入页码
      • 2.2.4 主体部分设计
      • 2.2.5 主体表格重复标题行
    • 2.3 建立数据源
    • 2.4 通过reportviewer显示/打印/导出报表
  • 3. 小结

1. 下载安装

1.1 通过NuGet下载相关包。


1.2 安装报表设计器

2. 报表设计

2.1 添加1个报表



2.2 设计报表

2.2.1 页面设置

在报表主体外面点击鼠标右键,点击快捷菜单中的报表属性按钮。

在弹出的如下窗口中设置纸张大小和页边距。

2.2.2 添加页眉页脚

在报表主体外面点击鼠标右键,点击快捷菜单中的相应按钮。

注意:页眉页脚的高度需要根据需要设计,报表打印中的页眉页脚高度与再此设计的一样,主体部分高度会自适应。

页眉和页脚可插入的对象如下图:

2.2.3 插入页码

在页脚插入一个文本框,右键点击文本框(注意不是在文本框编辑模式哦),在弹出的菜单中点击“表达式”,如下图。

在弹出的对话框中双击相应的项,再确定就OK。本人测试,一次只能输入1个参数,想要一次性弄成“第N页 共 M 页”好像是不行的,得拿个文本框显示当前页码,一个文本框显示总页数,一个文本框显示“第 页 共 页”,然后将他们的位置调一下。也许是我还没完全搞懂,有知道的可留言分享下。

2.2.4 主体部分设计

主体部分可插入的对象:

2.2.5 主体表格重复标题行

这个花我时间最长,完全把以前的经验忘干净了,查了很多资料才搞定。直接说步骤:

(1) 勾选设计器下方的高级模式,然后在“行组”和“列组”中才会有列出的内容。

(2) 列标题得在“行组”中设置,选中最上面那个“静态”,在设计区域就可以看到标题行被选中了。

(3) 选中主体设计区中表格的标题行,注意是整行选中,点击鼠标右键,在弹出的快捷菜单中点击“Tablix属性”按钮。


在弹出的对话框中勾选红框中的选项,点击“确定”。

2.3 建立数据源

(1) 右键单击属性窗中的项目名称–>新建项–>添加数据集。

(2) 在数据集设计窗体中添加你想要的数据集。我这里为了改写方便,建的是datatable.

报表设计好后,数据集建好了,就可以考虑如何呈现报表了。

2.4 通过reportviewer显示/打印/导出报表

(1) 新建一个winform,在winform中拖放一个reportviewer控件

(2) 点击报表控件右上角的小三角形,选择要显示的报表。

(3) 点击报表控件右上角的小三角形,选择数据源。

(3) 更新数据源内容,并更新报表。我这里需要用到两个数据源,一个是“DataTable01_0”,一个是“DataTable01_1”。此部分我是通过代码来完成的。点击窗体上的“button1”就更新数据和更新报表。代码如下:

private void button1_Click(object sender, EventArgs e){//清除原来datatable中的数据DataSet01._DataTable01_0.Rows.Clear();//给datatable添加新数据,注意数据要与设计的datatable字段对应。DataSet01._DataTable01_0.Rows.Add(new object[] { "2022-01-05-01", "XXXXXX", "XXXXXXX", "XXXXXX", "XXXXX", "XXXXX", "XXXXX", "XXXXX", 10000000, 1300000, 9000000, "XXXXX", "荀彧", "诸葛亮" });//清除原来datatable中的数据DataSet01._DataTable01_1.Rows.Clear();//给datatable添加新数据,注意数据要与设计的datatable字段对应。for (int i = 1; i <= 100; i++){DataSet01._DataTable01_1.Rows.Add(new object[] { i, "商品名称" + i, "商品规格" + i, "套", 5, 100, 500, "备注内容" + i });}//清除reportviewer1中原来的数据绑定this.reportViewer1.LocalReport.DataSources.Clear();//重新给reportviewer1绑定数据源,名称需要用我们之前设定的 "DataSet01_0"this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet01_0", (DataTable)DataSet01._DataTable01_0));this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet01_1", (DataTable)DataSet01._DataTable01_1));//刷新报表控件,显示最新数据this.reportViewer1.RefreshReport();}

3. 小结

走了不少弯路,整体步骤就是这么一个过程。还有些细节需要慢慢摸索。好像这个报表文件是可以放在服务器的,还没研究出来。希望此文可以让看到的人少走一些弯路。

C#ReportViewer应用小结相关推荐

  1. 基于MVC4+EF5+EasyUI技术实现通用权限管理系统(EpPlus、HignCharts、Reportviewer报表)...

    基于MVC4+EF5+EasyUI技术实现通用权限管理系统(EpPlus.HignCharts.Reportviewer报表) 适合人群:高级 课时数量:150课时 用到技术:MVC.EF.T4.Lo ...

  2. 【阶段小结】协同开发——这学期的Git使用小结

    [阶段小结]协同开发--这学期的Git使用小结 一.Git简介 1. Git简单介绍 2. Git工作流程以及各个区域 3. Git文件状态变化 二.Git安装&Git基本配置 三.个人踩坑 ...

  3. 正则表达式(括号)、[中括号]、{大括号}的区别小结

    正则表达式(括号).[中括号].{大括号}的区别小结 </h1><div class="clear"></div><div class=& ...

  4. php中$_REQUEST、$_POST、$_GET的区别和联系小结

    php中$_REQUEST.$_POST.$_GET的区别和联系小结 作者: 字体:[增加 减小] 类型:转载 php中有$_request与$_post.$_get用于接受表单数据,当时他们有何种区 ...

  5. c cin.get()的用法小结_c语言中static 用法

    static在c里面可以用来修饰变量,也可以用来修饰函数. 先看用来修饰变量的时候.变量在c里面可分为存在全局数据区.栈和堆里.其实我们平时所说的堆栈是栈而不是堆,不要弄混. int a ; int ...

  6. linux 压缩文件夹格式,Linux下常见文件格式的压缩、解压小结

    Linux下常见文件格式的压缩.解压小结 .tar 解包: tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ...

  7. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  8. flash 入门课知识小结

    一. 几种类型帧的小结:(关键帧.空白关键帧.普通帧) 1. 特点   帧--是进行flash动画制作的最基本的单位,每一个精彩的flash动画都是由很多个精心雕琢的帧构成的,在时间轴上的每一帧都可以 ...

  9. Eigen/Matlab 使用小结

    文章目录 [Eigen Matlab使用小结](https://www.cnblogs.com/rainbow70626/p/8819119.html) Eigen初始化 0.[官网资料](http: ...

最新文章

  1. 发布程序后显示:未能创建类型
  2. Win7系统下装Linux操作系统详细流程(图文)
  3. am5728 是否支持aarch64_am5728开启uart0接口通讯
  4. 【操作】鼠标hover效果——元素凸起并产生阴影
  5. canvas rotate 累加旋转_高考数列通项公式解题方法(1):观察法、公式法、累加法、累乘法...
  6. c语言中判断输入是否为数字_C 判断
  7. ulink php,【转载】15款USB数字界面横向评测(对比顶级CD转盘)!多看点!
  8. MySQL名字的年夜小写敏感性
  9. 微信输入法要来了!就长这个样子
  10. LeetCode 5352. 生成每种字符都是奇数个的字符串
  11. 设计模式(一)—单例模式
  12. 查看linux的系统命令,命令行查看Linux的系统版本和内核版本以及机器字长
  13. LINUX当前目录下的文件夹大小
  14. 宏杉科技高端存储再获认可 成功中标国家电网集采
  15. 关系代数题目小汇总——数据库
  16. 笔记本电脑用u盘一键重装系统步骤
  17. 推流拉流RMTP方案:Nginx+ffmpeg/obs+vlc/h5
  18. 关于网站目录结构需要注意的地方
  19. YOLO v5 实现目标检测(参考数据集自制数据集)
  20. c++中cout、cerr、clog的区别

热门文章

  1. 百度 搜索原理 如何 应对百度 的封杀 和 降权
  2. Linux 系统分区方案(双系统 Linux 200G+ win10)
  3. 计算机更新策略,客户端无法更新组策略
  4. 苹果官方发放Apple无损音乐会员,iPhone用户独享
  5. MQ ActiveMQ入门介绍及核心原理
  6. PostgresSQL 分页查询 SQL语句
  7. Understanding the difficulty of training deep feedforward neural networks
  8. 前端面试实战问题总结
  9. 集群/分布式环境下5种session处理策略
  10. 2018年9月13日英语学习