在应用程序中,通常我们都需要显示报表。在.net中,我们大多数情况使用了水晶报表,如果我们不是直接将报表发送到打印机打印,那么就需要将报表显示出来,这种情况下需要使用报表查看器(CrystalReportViewer)。

CrystalReportViewer作为一个控件,它需要一个承载它的窗体或页面,我们这里只讨论窗体(WinForm)的情况。大多数情况下,我们显示报表的界面都是相同的,因此,我们一般会做一个窗体类,来显示我们不同的报表。在有的实现中,我们是在这个窗体类中实例化我们所需要的报表对象的,当我们每次要显示不同的报表时,都需要去维护这个报表显示窗体类,这样会给我们带来许多不便。更有甚者,把一些报表的逻辑也写到了这个窗体类中,这样严重违反了类的单一职责原则,并且使我们的报表与报表显示之前有很强的依赖性。

为了遵循类的单一职责原则,破除它们之前的相互依赖性,在下面我将提供一个实现水晶报表显示的范例,这个范例的灵感来源于 MessageBox类,只提供了几个静态公共方法用于显示报表:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

using CrystalDecisions.CrystalReports.Engine;
using ChiefValueAccounting.Util;

namespace ChiefValueAccounting.Win.Print
{
 /// <summary>
 /// 显示与打印水晶报表。
 /// </summary>
 public class CrystalReportBox
 {
  private static CrystalDecisions.Windows.Forms.CrystalReportViewer crystalReportViewer;
  private static System.Windows.Forms.Form frmReport;

static CrystalReportBox()
  {
   InitializeComponent();
  }

private static void InitializeComponent()
  {
   frmReport = new Form();
   crystalReportViewer = new CrystalDecisions.Windows.Forms.CrystalReportViewer();
   frmReport.SuspendLayout();
   //
   // crystalReportViewer
   //
   crystalReportViewer.ActiveViewIndex = -1;
   crystalReportViewer.DisplayGroupTree = false;
   crystalReportViewer.Dock = System.Windows.Forms.DockStyle.Fill;
   crystalReportViewer.Location = new System.Drawing.Point(0, 0);
   crystalReportViewer.Name = "crystalReportViewer";
   crystalReportViewer.ReportSource = null;
   crystalReportViewer.Size = new System.Drawing.Size(708, 482);
   crystalReportViewer.TabIndex = 0;
   //
   // frmReport
   //
   frmReport.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
   frmReport.ClientSize = new System.Drawing.Size(708, 482);
   frmReport.Controls.Add(crystalReportViewer);
   frmReport.Name = "FormPrintReportEx";
   frmReport.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
   frmReport.Text = "Report Viewer";
   frmReport.WindowState = System.Windows.Forms.FormWindowState.Maximized;
   frmReport.MaximizeBox = false;
   frmReport.MinimizeBox = false;
   frmReport.ShowInTaskbar = false;
   frmReport.FormBorderStyle = FormBorderStyle.FixedDialog;
   frmReport.ResumeLayout(false);
  }

/// <summary>
  /// 显示水晶报表,要求调用方设置好报表对象的所有属性。
  /// </summary>
  /// <param name="reportClass">强类型的报表对象</param>
  public static void ShowReport(CrystalDecisions.CrystalReports.Engine.ReportClass reportClass, System.Windows.Forms.IWin32Window owner)
  {
   try
   {
    crystalReportViewer.ReportSource = reportClass;
    frmReport.ShowDialog(owner);
   }
   catch(Exception ex)
   {
    SimpleLogger.Log(ex);
    Global.ShowError(ex);
   }
  }

/// <summary>
  /// 显示水晶报表,要求调用方设置好报表对象的所有属性。
  /// </summary>
  /// <param name="reportDocument">水晶报表文档对象</param>
  public static void ShowReport(CrystalDecisions.CrystalReports.Engine.ReportDocument reportDocument, System.Windows.Forms.IWin32Window owner)
  {
   try
   {
    crystalReportViewer.ReportSource = reportDocument;
    frmReport.ShowDialog(owner);
   }
   catch(Exception ex)
   {
    SimpleLogger.Log(ex);
    Global.ShowError(ex);
   }
  }

/// <summary>
  /// 显示水晶报表。
  /// </summary>
  /// <param name="reportName">报表名称</param>
  /// <param name="dataSource">报表数据源</param>
  public static void ShowReport(string reportName, object dataSource, System.Windows.Forms.IWin32Window owner)
  {
   try
   {
    ReportDocument rd = new ReportDocument();
    rd.Load(reportName);
    rd.SetDataSource(dataSource);
    frmReport.ShowDialog(owner);
   }
   catch(Exception ex)
   {
    SimpleLogger.Log(ex);
    Global.ShowError(ex);
   }
  }
 }
}
也就是说,对于报表中的一些业务逻辑设置,是不应该放到这个显示类中的,而是应该由调用方负责进行设置与刷新。
 欢迎大家提出宝贵的反馈信息!

转载于:https://www.cnblogs.com/jigee/archive/2006/04/30/389507.html

显示水晶报表的公用类相关推荐

  1. 水晶报表技术(12)——一个投票系统水晶报表应用

        前一段时间,公司需要做一个在线的调查投票系统,目的是统计公司能力等级指数,统计的能力级别分三大类,分别为一级能力要素,二级能力要素,三级能力要素,不同的一级能力要素下面分若干的二级能力要素,每 ...

  2. 水晶报表中对某一栏位值进行处理_终于有人讲清楚了,BI和报表的差异!

    IT系统自带报表功能,为什么还要额外采购BI? 报表和BI都能做数据分析,区别在哪里? 加班加点做了那么多表,为什么还不满足老板需求? 报表分析需要IT团队来开发,那BI呢? 这些应该是大家对商业智能 ...

  3. 水晶报表技术(3)——.NET 2005 中动态水晶报表的实现

    .NET 2005 中动态水晶报表的实现<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office ...

  4. JAVA水晶报表从环境搭建到创建动态水晶报表

    首先第一步贴上项目截图(少了一个rpt_report文件夹,因为是网上的所以这里没加,各位可以加下):声明该项目是网上下载.(比较简单,纯属偷懒,有现成环境).可以自己修改,需要注意的就是蓝色标记的地 ...

  5. winform下制作第一张水晶报表

    初学水晶报表,一头雾水,都是希望先找个简单的示例型的文章看看,本篇就非常的适合(仅适合接触水晶报表但是一个都没有写过的同仁). 本示例环境:windows2003.vs.net2003.Sql Ser ...

  6. 在水晶报表中实现任意选择指定字段显示-模板及C#升级版

    前文<在水晶报表中实现任意选择指定字段显示>中有朋友留言说是有无C#版本,最近有时间,重写了一下. 一是使用了VS2005 C#2.0 + Crystal Report 2008,另外就是 ...

  7. 自定义水晶报表的显示

      自定义水晶报表的显示,比如隐藏工具栏,让报表左对齐,去除水晶报表的公司LOGO等---(新作:海波.NET)     -------------------------------------- ...

  8. Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据 二)...

    在Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据一)中,解释了如何把Crystal Report整合到Sharepoint ...

  9. 水晶报表 jar包版本过低_工具类学习-UReport报表设计器整合

    dada-report报表整合UReport报表设计器工具 结合日常工作和学习实践,针对传统报表子站面临的问题,尝试借助UReport报表设计器解决 1.可在现有工程基础上引入Ureport2报表设计 ...

  10. 如何在水晶报表显示上下标

    在水晶报表中显示上下标的配置如下: 1.在数据库字段中存储html代码:例如:<p>H<font size=2>2</font>O</p> (显示出&q ...

最新文章

  1. Struts2学习第七课 ActionSupport
  2. ABAP 如何判断调用smartforms时是进行打印还是预览
  3. js树形导航栏 jquery
  4. gRPC-Web发布,REST又要被干掉了?
  5. 网络安全技术之端口隔离
  6. 干货|一文读懂阿里云数据库Autoscaling是如何工作的
  7. T1042/T2080芯片工控主板对比
  8. asp.net用url重写URLReWriter实现任意二级域名(续)
  9. nginx ---- 配置成系统服务
  10. [蓝桥杯]试题 基础练习 完美的代价
  11. linux 汽车仪表软件架构,基于嵌入式Linux的汽车全数字仪表界面的设计
  12. 高效地获取XMLhttp对象
  13. STM32F407 USB CDC调试与经验总结
  14. 极化SAR图像特征提取与分类方法研究
  15. HyperAttentionDTI: improving drug–protein interaction prediction by sequence-based deep learning wit
  16. Latex \TexStudio 设置数学符号
  17. 中国志愿者服务器注册,如何注册成为志愿者?中国志愿服务网注册流程
  18. 现场总线CANopen设计与应用
  19. 小米平板4刷recovery教程_米板4解锁刷机教程
  20. android 自动调整屏幕分辨率

热门文章

  1. 深度学习(三):初级卷积神经网络
  2. 科罗拉多州立大学计算机科学专业,2020年科罗拉多州立大学有哪些优势专业
  3. java 整数相乘_Java中两个int相乘的结果是怎么算的?
  4. python deque索引超出范围_python的常用内建模块与常用第三方模块
  5. C++ 构造函数后面有冒号 ~ : ()
  6. 区块链共识算法的分类 POW POS DPOS PBFT的区别
  7. 单片机4层电梯设计c语言,详解基于单片机的四层电梯控制系统的设计与实现,Proteus仿真和程序代码...
  8. matlab重叠图像块拼接,在matlab中拼接图像时如何正确混合?
  9. mysql水平union_mysql_union操作符
  10. 提前观摩打二字计算机英语,英语口语国赛规划.doc