最近一段时间开发ERP系统中要用到不少报表打印,在网上找了一圈发现想些好用的报表控件大部分要收费,一些面免费要么不好用要么IE8不兼容,最后还是用了微软自带的RDLC报表,把自己遇到的坑和技巧整理分享出来。

一般Visaul Studio上新建的的EDLC报表文件之后数据源都是按照向导直接连接数据库,自动生成数据源和数据集的,但是遇到一些复杂的就不够灵活。

一、新建报表

1.新建一个空白的报表如下

2.打开新建好的空报表文件,选择报表文件右键选择【打开方式】→【XML(文本)编辑】打开 在Page节点下面添加DataSources 和DataSets 节点

1)空报表文件

<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
<Width>6.5in</Width>
<Body>
<Height>2in</Height>
</Body>
<rd:ReportTemplate>true</rd:ReportTemplate>
<Page>
</Page>
</Report>

2)添加节点后

<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
<Width>6.5in</Width>
<Body>
<Height>2in</Height>
</Body>
<rd:ReportTemplate>true</rd:ReportTemplate>
<Page>
</Page>
<DataSources>
<DataSource Name="ProductOrderSource">
<ConnectionProperties>
<DataProvider>System.Data.DataSet</DataProvider>
<ConnectString>/* Local Connection */</ConnectString>
</ConnectionProperties>
<rd:DataSourceID>50f42c3f-789d-4967-8d8b-5dbe50b3a677</rd:DataSourceID>
</DataSource>
</DataSources>
<DataSets>
<DataSet Name="ProductOrderDs">
<Query>
<DataSourceName>ProductOrderSource</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<Fields>
<Field Name="ProductOrderId">
<DataField>ProductOrderId</DataField>
<rd:TypeName>System.Guid</rd:TypeName>
</Field>
<Field Name="SKUDetail">
<DataField>SKUDetail</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
<Field Name="Quantity">
<DataField>Quantity</DataField>
<rd:TypeName>System.Int32</rd:TypeName>
</Field>
<Field Name="DeliveryDate">
<DataField>DeliveryDate</DataField>
<rd:TypeName>System.DateTime</rd:TypeName>
</Field>
<Field Name="DeliveryDateActual">
<DataField>DeliveryDateActual</DataField>
<rd:TypeName>System.DateTime</rd:TypeName>
</Field>
<Field Name="Bak">
<DataField>Bak</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
</Fields>
<rd:DataSetInfo>
<rd:DataSetName>ProductOrderSource</rd:DataSetName>
<rd:TableName>ProductOrderDetail</rd:TableName>
<rd:TableAdapterGetDataMethod>GetData</rd:TableAdapterGetDataMethod>
</rd:DataSetInfo>
</DataSet>
</DataSets>
</Report>
DataSources:数据源名称标签,每次加一个新的数据源需要在 DataSources 标签下新标签DataSource
DataSets:数据实体集合,每次新添加一个数据源后在DataSets 对应添加新的DataSet节点,DataSourceName和DataSetName 要和DataSource 的Name 名称一致。Fields 下面是添加每个实体对应的字段

3.报表DataSource和DataSet建好后可以看到刚才添加的数据源和数据集

4.设计好需要额报表,填充刚才数据集里对应的字段

5.后台数据源赋值代码
   public ActionResult PrintProduct()
{
string reportPath = Server.MapPath("~/Reports/订单信息.rdlc"); var localReport = new LocalReport { ReportPath = reportPath }; List<ProductOrder> productOrders = new List<ProductOrder>(); for (int i = ; i < ; i++)
{
ProductOrder productOrder=new ProductOrder
{
SKUDetail = $"A00300000{i}",
Quantity = i,
DeliveryDate = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd HH:mm:ss"),
DeliveryDateActual = DateTime.Now.AddDays(i+).ToString("yyyy-MM-dd HH:mm:ss")
};
productOrders.Add(productOrder); }
var dataSource = new ReportDataSource("ProductOrderDs", productOrders);
localReport.DataSources.Add(dataSource); var type = "PDF";
string reportType = type;
string mimeType;
string encoding;
string fileNameExtension; var deviceInfo = $"<DeviceInfo><OutPutFormat>{type}</OutPutFormat></DeviceInfo>"; Warning[] warnings;
string[] streams; var renderedBytes = localReport.Render(
reportType,
deviceInfo,
out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings); return File(renderedBytes, mimeType);
}

实体代码:

 public class ProductOrder
{
public Guid ProductOrderId { get; set; }
public string SKUDetail { get; set; } public int Quantity { get; set; } public string DeliveryDate { get; set; } public string DeliveryDateActual { get; set; } public string Bak { get; set; }
}

注意:报表文件DataSet中的用到的字段必须和实体字段对应,代码中DataSource 中名字必须和报表中的一样

最后预览如下:

——当你的才华还撑不起你的野心时,你就应该静下心来好好学习~
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

RDLC系列(一)ASP.NET RDLC 报表自定义数据源的更多相关文章

  1. RDLC系列之二 子报表

    本文实现简单的子报表 一.效果图

  2. ASP.NET之报表--RDLC(一)---附源码

    听同事介绍到RDLC,之前有了解过报表,但是确实没什么放在心上.最近有空,就研究下了. 一.RDLC实现 1.步骤 (1)首先新建一个项目RDLCDemo (2)新建一个DataSet数据集,并且绑定 ...

  3. asp.net RDLC报表入门

    Asp.net RDLC 报表入门 这几天帮给同事讲解Asp.net RDLC 报表方面的知识,顺便做个简单教程,在这里分享给大家. 由于图片多又大,写了一半,光上传图片就把我累个半死,所以我教把程放 ...

  4. RDLC系列之一 简单示例

    参照文章:http://www.cnblogs.com/waxdoll/archive/2006/07/24/458409.html#!comments 一.效果图

  5. RDLC系列之一 简介和入门

    一.简介 RDLC报表,通过Report Viewer Control来实现,制作微软RDLC报表由以下三部分构成:1.制作自己的DateSet集合(就是报表的数据集):2.制作自己的报表文件.rdl ...

  6. ASP.NET Core MVC – 自定义 Tag Helpers

    ASP.NET Core Tag Helpers系列目录,共四篇: ASP.NET Core MVC Tag Helpers 介绍 ASP.NET Core MVC – Caching Tag Hel ...

  7. 【深入ASP.NET原理系列】--ASP.NET页面生命周期

    前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...

  8. 【深入ASP.NET原理系列】--ASP.NET请求管道、应用程序生命周期、整体运行机制

    微软的程序设计和相应的IDE做的很棒,让人很快就能有生产力..NET上手容易,生产力很高,但对于一个不是那么勤奋的人,他很可能就不再进步了,没有想深入下去的动力,他不用去理解整个框架和环境是怎么执行的 ...

  9. 【Lucene3.6.2入门系列】第05节_自定义停用词分词器和同义词分词器

    首先是用于显示分词信息的HelloCustomAnalyzer.java package com.jadyer.lucene; import java.io.IOException; import j ...

随机推荐

  1. poj2528 Mayor's posters(线段树区间覆盖)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 50888   Accepted: 14737 ...

  2. Myeclipse SVN 修改用户名和密码

    转自:http://blog.csdn.net/chow__zh/article/details/7731497 解决方案: 在Eclipse使用SVN的过程中大多数人往往习惯把访问SVN的用户名密码 ...

  3. Jmeter 新手

    转载:http://www.cnblogs.com/TankXiao/p/4059378.html 什么是压力测试 顾名思义:压力测试,就是  被测试的系统,在一定的访问压力下,看程序运行是否稳定/服 ...

  4. xshell安装运行时提示缺少mfc110.dll

    下载最新的mfc110.dll文件 https://pan.baidu.com/share/link?shareid=1932421734&uk=1784696518&app=zd 之 ...

  5. JS模板引擎:基于字符串拼接

    目的 编写一个基于字符串拼接的js模板引擎雏形,这里并不会提供任何模板与数据的绑定. 基本原理 Javascript中创建函数的方式有多种,包括: 1. var func = function () ...

  6. Goldengate双向复制配置

    一.Goldengate双向复制配置 1.1.在进行如下配置之前,先在源数据库source system(原来的目标数据库)端 添加辅助的redolog配置: SQL>alter databas ...

  7. swift中标签的使用

    1,标签的创建 1 2 3 4 5 6 7 8 9 10 import UIKit class ViewController: UIViewController {     override func ...

  8. 修改GitHub上项目语言显示的问题

    问题 最近将自己写的博客放到github上了.由于使用了富文本编辑器.jQuery.Bootstrap等第三方插件,导致js.css等代码远远超过你自己写的代码. 于是也就成这样了 而且这里也显示Ja ...

  9. leetcode难度及面试频率

    转载自:LeetCode Question Difficulty Distribution                 1 Two Sum 2 5 array sort           set ...

  10. 删除坐标相同文本对象 按照原y坐标排序

    ;; ;;程序名称:对象水平对齐程序,并且按照竖直方向排列 ;;执行命令:tb2 ;;程序功能:将选定的对象左对齐,并且按照竖直方向排列. ;; (defun c:tb2(/ selobjs oldc ...