题记:

最近有在用FastReport进行开发报表工作,当然也有在看书,突然想到可以用书中所写来实现一个fastreport的帮助类。

对于引用第三方类库,我们都会去将这个库在调用前进行相应的封装,也就是所谓的程序提供者模式。对第三方进行封装,当需要改变第三方(使用”第四方“的时候)不会影响到我们先前的实现,只需在程序提供处进行处理就好了。

好了,废话不多说,直接上些干活来:

一、定义基本的实现类

  1. public class FastReportHelper
  2. {
  3. public FastReport.Report report = null;
  4. public FastReport.Report MReport
  5. {
  6. get
  7. {
  8. return report;
  9. }
  10. set
  11. {
  12. report = value;
  13. }
  14. }
  15.  
  16. public FastReportHelper(string templateFile, string printerName, FastReport.Preview.PreviewControl pc)
  17. {
  18. if (string.IsNullOrEmpty(templateFile))
  19. {
  20. throw new ArgumentNullException("报表模板不能为空!");
  21. }
  22. if (!File.Exists(templateFile))
  23. {
  24. throw new FileNotFoundException(string.Format("报表模板“{0}”不存在!", templateFile));
  25. }
  26. if (!string.IsNullOrEmpty(printerName) && !PrinterInfo.ValidatePrinterIsExist(printerName))
  27. {
  28. throw new Exception(string.Format("打印机“{0}”不存在!"));
  29. }
  30. if (pc != null)
  31. {
  32. report.Preview = pc;
  33. }
  34. report = new FastReport.Report();
  35. report.Load(templateFile);
  36. }
  37. public void Show()
  38. {
  39. if (report != null)
  40. {
  41. report.Prepare();
  42. report.ShowPrepared();
  43. }
  44. }
  45. public void Print()
  46. {
  47. if (report != null)
  48. {
  49.  
  50. report.PrintPrepared();
  51. report.Print();
  52. }
  53. }
  54. public void Print(PrinterSettings printSettings)
  55. {
  56. if (report != null)
  57. {
  58. this.report.PrintPrepared(printSettings);
  59. this.report.Print();
  60. }
  61.  
  62. }
  63. }

打印所需一般就分为:1、模板;2、数据源、3、打印设置,当然上面的类没有实现打印几份,单面打印还是双面打印等,所以均为默认。如果问我为毛这么写,那么请看下面

二、对基本的实现类进行扩展,从而在调用的时候实现链式编程。

  1. public static class FastReportExtend
  2. {
  3. public static FastReportHelper RegesterData(this FastReportHelper fastReportHelper, DataSet ds)
  4. {
  5. for (int i = ; i < ds.Tables.Count; i++)
  6. {
  7. fastReportHelper.MReport.RegisterData(ds.Tables[], ds.Tables[].TableName);
  8. }
  9.  
  10. return fastReportHelper;
  11. }
  12. public static FastReportHelper RegesterData(this FastReportHelper fastReportHelper, IEnumerable<object> data, string dataName)
  13. {
  14. fastReportHelper.report.RegisterData(data, dataName);
  15. return fastReportHelper;
  16. }
  17. public static FastReportHelper RegesterData(this FastReportHelper fastReportHelper, DataTable dt, string dtName = "")
  18. {
  19. string name = string.IsNullOrEmpty(dtName) ? dt.TableName : dtName;
  20. fastReportHelper.report.RegisterData(dt, name);
  21. return fastReportHelper;
  22. }
  23. public static FastReportHelper SetParameters(this FastReportHelper fastReportHelper, Dictionary<string, object> dicParameters)
  24. {
  25. if (dicParameters != null || dicParameters.Count > )
  26. {
  27. foreach (KeyValuePair<string, object> item in dicParameters)
  28. {
  29. fastReportHelper.report.SetParameterValue(item.Key, item.Value);
  30. }
  31. }
  32. return fastReportHelper;
  33. }
  34. public static FastReport.Report SetParameters(this FastReport.Report report, Dictionary<string, object> dicParameters)
  35. {
  36. if (dicParameters != null || dicParameters.Count > )
  37. {
  38. foreach (KeyValuePair<string, object> item in dicParameters)
  39. {
  40. report.SetParameterValue(item.Key, item.Value);
  41. }
  42. }
  43. return report;
  44. }
  45.  
  46. }

最后、打印机的获取

  1. /// <summary>
  2. ///
  3. /// </summary>
  4. public class PrinterInfo
  5. {
  6. /// <summary>
  7. /// 判断打印机是否存在
  8. /// </summary>
  9. /// <param name="printerName"></param>
  10. /// <returns></returns>
  11. public static bool ValidatePrinterIsExist(string printerName)
  12. {
  13. foreach (var item in PrinterSettings.InstalledPrinters)
  14. {
  15. if (item == printerName)
  16. return true;
  17. }
  18. return false;
  19. }
  20. /// <summary>
  21. /// 获取默认打印机名称
  22. /// </summary>
  23. /// <returns></returns>
  24. public static string GetDefaultPrinter()
  25. {
  26. return new PrintDocument().PrinterSettings.PrinterName;
  27. }
  28. }

乱来一通,最近在搞vb.net,想屎的心都有了。

洗洗睡吧。

FastReport扩展类的更多相关文章

  1. C# 扩展类

    C# 中提供一个非常实用的供能,扩展方法(Extension method) 扩展方法是通过额外的静态方法扩展现有的类型.通过扩展方法,可以对已有类型做自己想做的相关扩展.方法:定义静态类,扩展方法也 ...

  2. tp中调用PHP系统扩展类

    例如使用Redis扩展类: use Reids; $redis = new Redis();

  3. Java+7入门经典 - 6 扩展类与继承 Part 1/2

    第6章 扩展类与继承 面向对象编程的一个重要特性: 允许基于已定义的类创建新的类; 6.1 使用已有的类 派生 derivation, 派生类 derived class, 直接子类 direct s ...

  4. Thinkphp编辑器扩展类kindeditor用法

    一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp站点项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们拷贝到你的站点项目的Th ...

  5. 扩展javascript扩展(类,对象,原型)

     扩展javascript扩展(类,对象,原型)

  6. 颜色扩展类--ColorExtensions

    /// <summary> /// 颜色扩展类 /// </summary> public static class ColorExtensions { /// <sum ...

  7. PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载

    文章转载自:https://my.oschina.net/junn/blog/104464 PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PH ...

  8. ASP.NET MVC4 HtmlHelper扩展类,实现分页功能 @Html.ShowPageNavigate

    本文主要做了一个HtmHelper类的分页扩展函数,方便在视图中调用,有需要的朋友可以参考一下,希望对大家有所帮助. 1.扩展HtmlHelper类方法ShowPageNavigate output. ...

  9. C#操作Xml树的扩展类

    本文提供一个操作Xml树的扩展类,与将xml字符串直接映射成实体对象的使用方法,供大家参考,学习. 下面附上源码 using System; using System.Collections.Gene ...

随机推荐

  1. hdu1011(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:有n个洞组成一棵树,你有m个士兵,你从1号房间开始攻打,每个洞有a个"bugs& ...

  2. CodeIgniter Apacheserver htaccess SEO重写写法

    1)支持重写 2)兼容全部APACHE server 3)假设不是文件,请求的结尾不包含反斜杠,自己主动跳转到反斜杠 4)文件名称 .htaccess 5)这个放到nginxserver怎么都不支持重 ...

  3. c++构造函数隐式转换--转换构造函数

    其实我们已经在C/C++中见到过多次标准类型数据间的转换方式了,这种形式用于在程序中将一种指定的数据转换成另一指定的类型,也即是强制转换,比如:int a = int(1.23),其作用是将1.23转 ...

  4. javascript面向对象之闭包

    javascript面向对象之闭包 学习javascript一段时间了,自己对闭包作出如下总结,如有某点不妥,请君指出,不胜感激! 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量 ...

  5. crontab,想说爱你不easy

    悲剧的背景 跑自己主动化脚本的机器连不上toastserver了, 仅仅能自己写个脚本每天跑了. 当然要放在crontab里了. 5 3 * * * sh ~/nosecron.sh 更悲剧的结果 第 ...

  6. Codeforces Round #248 (Div. 1)——Nanami&#39;s Digital Board

    题目连接 题意: 给n*m的0/1矩阵,q次操作,每次有两种:1)将x,y位置值翻转 2)计算以(x,y)为边界的矩形的面积最大值 (1 ≤ n, m, q ≤ 1000) 分析: 考虑以(x,y)为 ...

  7. 怎样在Android开发中FPS游戏实现的两种方式比较

    怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...

  8. String,StringBuffer和StringBuilder的异同

                                                                    String,StringBuffer和StringBuilder的异同 ...

  9. 输入框 js正则推断输入

    1.文本框仅仅能输入数字代码(小数点也不能输入)  <input onkeyup="this.value=this.value.replace(/\D/g,'')" onaf ...

  10. DB2 “The transaction log for the database is full” 存在的问题及解决方案

    DB2在执行一个大的insert/update操作的时候报"The transaction log for the database is full.. "错误,查了一下文档是DB ...