原文:ReportViewer,RDLC 报表开发之个性化样式

报表开发中,客户对样式提出了要求:

1.工具栏上显示每页条数

2.只导出Excel,不需要下拉菜单。

3.报表上显示的图表,分页时,每页都要显示,但导出后,图表是一个,且都在最下面。

另外的功能点:

4.每页显示标头

5.标题行和 奇偶行样式

解决方案:

1.工具栏上显示每页条数

  搜索无果后(RportViewer 没提供类似的功能吧.),暴力解决.好像网上也有类似的方案.

    /// <summary>
/// 给报表添加每页条数. Udi 2012年3月2日
/// </summary>
/// <param name="Report"></param>
/// <param name="hdPageSize"></param>
public static void AddPageSize(this ReportViewer Report, HtmlInputHidden hdPageSize, Control Button)
{
var toolBar = FindToolBar(Report.Controls, "Microsoft.Reporting.WebForms.ToolbarControl");

//第1个是页码组,第2个是缩放组. 有依赖性.
var zoomGroup = toolBar.Controls[];

var label = new LiteralControl();
label.ID = "lab_PageSize";

var items = new int[] { , , , };
var options = new List<string>();
for (int i = ; i < items.Length; i++)
{
options.Add(string.Format(@"<option value='{0}' {1}>{0}</option>", items[i], hdPageSize.Value == items[i].ToString() ? "selected" : ""));
}

label.Text = string.Format(@"每页条数: <select onchange=""{0}"" style='width:40px'>{1}</select>",
string.Format(@"(function(item){{$('#{0}').val($(item).val()); $('#{1}').trigger('click');}})(this);",
hdPageSize.ClientID,
Button.ClientID),
string.Join("", options.ToArray()));
zoomGroup.Controls.AddAt(, label);
}

private static Control FindToolBar(ControlCollection ReportControls, string FullTypeName)
{
foreach (Control item in ReportControls)
{
if (item.ToString() == FullTypeName) return item;
if (item.HasControls())
{
var subFind = FindToolBar(item.Controls, FullTypeName);
if (subFind != null) return subFind;
}
}
return null;
}

调用: (hdPageSize 是一个保存每页条数是Hidden, btnSearch 是 查询按钮, 需要模拟点击)

this.ReportViewer1.AddPageSize(this.hdPageSize, this.btnSearch);

2. 只导出Excel,不需要下拉菜单。

思路和上面差不多,索性写的方法再通用一点。

    /// <summary>
/// 给 ReportViewer 添加控件.
/// </summary>
/// <param name="Report"></param>
/// <param name="GroupIndex">组索引</param>
/// <param name="ControlIndex">组内控件索引</param>
/// <param name="Control"></param>
public static void AddToolControl(this ReportViewer Report, int GroupIndex, int ControlIndex, Control Control)
{
var toolBar = FindToolBar(Report.Controls, "Microsoft.Reporting.WebForms.ToolbarControl");

var zoomGroup = toolBar.Controls[GroupIndex];

zoomGroup.Controls.AddAt(ControlIndex, Control);
}

调用:(第一个索引,表示组索引, 第二个索引表示组内控件索引)

this.ReportViewer1.AddToolControl(5, 0, new LiteralControl() { Text = string.Format(@"<a class='expBtn' onclick=""document.getElementById('{0}').click();"">导出</>", this.btn_Excel.ClientID) });

3. 报表上显示的图表,分页时,每页都要显示,但导出后,图表是一个,且都在最下面。

之前是一个页面上绑定了一个 ReportViewer , 一个 RDLC . 两个数据源(一个用于分页, 一个用于出图. 其实没必要啊.反正也要取所有数据出图表,应该用一个全量数据源即可.这样做,多多少少受了分页方案的影响.),效果是 只在最后一页显示图表.

把 RDLC 拆成三部分.

第一部分: 数据+图表.  (导出用.)

第二部分: 数据
第三部分: 图表

页面上添加两个 ReportViewer

第一个: 显示数据

第二个: 显示图表 (隐藏工具栏)

看起来像一个.

显示时, Report_Data 绑定 RDLC_Data , Report_Chart 绑定 RDLC_Chart .

导出时, 使用 Report_Data 绑定 RDLC_Data_Chart .

即可.

4. 每页显示标题的设置方法:

RDLC 文件视图中: 选  列组, 点 高级模式 , 行组出现 静态(二级样式) . 在根静态上 f4, 设置:

KeepWithGroup: After

RepeateOnNewPage:True

属性表里选 : Tablix,设置:

RepeatColumnHeaders : True

RepeatRowHeaders : True

5.标题样式好说, 奇偶行样式设置

先中行,在 BackGroundColor 属性里设置表达式:

=IIF( ( RowNumber( Nothing ) +Fields!SysPageIndex.Value ) Mod 2 =1  ,  "#eeeeee" , "#fff")

注: RowNumber( Nothing ) 表示行号。

6.导出事件

        $find('ReportViewer1')._getInternalViewer().ExportReport = function (format) {
if (this.ExportUrlBase == null)
return false;
var format = encodeURIComponent(format).toLowerCase();
switch (format) {
case "excel":
document.getElementById("<%= btn_Excel.ClientID%>").click();
break;
case "pdf":
document.getElementById("<%= btn_PDF.ClientID%>").click();
break;
case "word":
document.getElementById("<%= btn_Word.ClientID%>").click();
break;
}
return true;
}

ReportViewer,RDLC 报表开发之个性化样式的更多相关文章

  1. 会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载

    在上篇<会员管理系统的设计和开发(1)>介绍了关于会员系统的一些总体设计思路和要点,经过一段时间开发,软件终于完成并发布.在这期间,碰到了不少技术难点,并积累了不少开发心得和经验,本篇继续 ...

  2. 让rdlc报表在ReportViewer中水平居中的方法

    正常情况下,rdlc报表在Reportviewer中是居左显示的,如图: 在Reporviewer的属性中,我没有找到能让rdlc的居中显示的方法.网上其他人用的方法都试了,没能实现,只能自己找方法解 ...

  3. 利用General框架开发RDLC报表

    RDLC是微软推出的自家的报表软件,虽然没有一些第三方的报表软件强大好用,但是作为VisualStudio集成的报表工具,在客户要求不高的情况下还是非常值得一用的,本文将介绍通过General代码生成 ...

  4. RDLC报表 在WinForm里运行出现 未能加载文件或程序集microsoft.reportviewer.winforms

    做一下记录顺便帮助一下遇到问题的朋友. 做RDLC报表在WinForm运行,在VS里面调试引用了“Microsoft.ReportViewer.Common.dll”和“Microsoft.Repor ...

  5. RDLC报表 在WinForm里运行出现 未能加载文件或程序集 Microsoft.ReportViewer.WinForms, Version=11.0.0.0 System.IO.FileNotFoundException

    原文:RDLC报表 在WinForm里运行出现 未能加载文件或程序集microsoft.reportviewer.winforms 推荐以下方案二 做一下记录顺便帮助一下遇到问题的朋友. 做RDLC报 ...

  6. 基于MVC4+EasyUI的Web开发框架经验总结(15)--在MVC项目中使用RDLC报表

    RDLC是一个不错的报表,有着比较不错的设计模式和展现效果,在我的Winform开发里面,使用RDLC也是一个比较方便操作,如可以参考文章<DevExpress的XtraReport和微软RDL ...

  7. 动态生成RDLC报表

    前段时间,做了RDLC报表,主要是三块功能: 1.从DataGrid提取(包括最新的增删改)的数据,自动生成对应的RDLC报表文件(以流的形式驻存在内存中),用ReportViewer类来展示.打印. ...

  8. 项目中使用RDLC报表

    原文地址:http://www.cnblogs.com/wuhuacong/p/4109833.html RDLC是一个不错的报表,有着比较不错的设计模式和展现效果,在我的Winform开发里面,使用 ...

  9. 在MVC项目中使用RDLC报表

    原文地址:http://www.cnblogs.com/wuhuacong/p/4109833.html RDLC是一个不错的报表,有着比较不错的设计模式和展现效果,在我的Winform开发里面,使用 ...

随机推荐

  1. 微信小程序从零开始开发步骤(四)

    上一章节,实现了小程序的底部导航的功能,这一节开始实现一些简单的功能.本章节介绍的是小程序的自定义分享的功能. 可以分享小程序的任何一个页面给好友或群聊.注意是分享给好友或群聊,并没有分享到朋友圈.一 ...

  2. java完美equals方法代码段

    public boolean equals(Object otherObject) { if(this == otherObject) { // 检測this与otherObject是否引用同一个对象 ...

  3. Jquery前端分页插件pagination使用

    插件描述:JqueryPagination是一个轻量级的jquery分页插件.只需几个简单的配置就可以生成分页控件.并且支持ajax获取数据,自定义请求参数,提供多种方法,事件和回调函数,功能全面的分 ...

  4. java--css+js做的树形菜单(完整版)

    jsp页面: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8 ...

  5. 小强的HTML5移动开发之路(33)—— jqMobi基础

    一.什么是jqMobi jqMobi是由appMobi针对HTML5浏览器和移动设备开发的javascript框架,是个极快速的查询选择库,支持W3C查询. 版本 jqMobi源码最初在2012年1月 ...

  6. Linux中vim编辑器莫名下方出现H的问题

    在使用vim编辑文件的时候,不知道自己是按了哪个快捷键,导致了,每次编辑文件时,下方命令行出现数字+H的格式命令,使得整个文件没法编辑,强制退出后进入不能解决问题,各种文件的编辑都不行,找不出原因,最 ...

  7. sparksql parquet 分区推断Partition Discovery

    网上找的大部分资料都很旧,最后翻了下文档只找到了说明 大概意思是1.6之后如果想要使用分区推断就要设置数据源的basePath,因此代码如下 java public class ParitionInf ...

  8. sqlserver中的存储过程 函数 事物 索引及视图

                                           存储过程和函数具体的区别: 核心提示:本质上没区别.只是函数有限制只能返回一个标量,而存储过程可以返回多个.并且函数是可以 ...

  9. Android中使用achartengine生成图表

    今天在做项目的时候用到了图表功能,记录下来 achartengine是google的一个开源项目,可以在https://code.google.com/p/achartengine/ 下载技术文档,j ...

  10. 使用Java Service Wrapper将java程序作为linux服务并且开机自动启动

    以java应用程序为例,打包为tianlong.jar,程序入口为tianlong.QueueTest. 下面在linux的/opt下建立tianlong目录,复制tianlong.jar到/opt/ ...