RDLC报表详细讲解与分析.doc_第1页
RDLC报表详细讲解与分析.doc_第2页
RDLC报表详细讲解与分析.doc_第3页
RDLC报表详细讲解与分析.doc_第4页
RDLC报表详细讲解与分析.doc_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

RDLCRDLC 报表随笔报表随笔 转载 感谢网友 蜡人张 一 VS NET 开发中 用什么做报表 可能的回答是 Crystal Report 自 NET 紧密 集成 Crystal Report 后 这可 能是开发人员比较单一的选择 但是 这种集成似乎并不非常紧密 网络上充斥着关于使 用 Crystal Report 的抱怨 太复杂也许是其最为令人诟病的地方 自定义性比较差也不能 为程序员们所容忍 当然 必须承认 Crystal Report 的功能还是非常强大的 被 Business Object 收 购以后 商业职能的成分也在逐渐增加 也形成了一定规模的用户群 Visual Studio NET 进入 2005 版本以后 Crystal Report 与 IDE 的结合更 紧 密 了 至少我们看不到那个讨厌的注册窗口了 但是 Microsoft 似乎并不容忍在自己 的超级工具中竟然没有报表工具 于是 Report Viewer Control 出现了 我把它的报表称 为 RDLC 报表 在 VS NET 2005 之前 SQL Server Reporting Services 中已经提供了一种被称 为报表定义语言 Report Definition Language RDL 的语言 在 VS NET 2005 中 Mic rosoft 提供了针对这种报表的设计器 并提供了在 WinForm 和 WebForm 中使用这种报表的 能力 Microsoft 将这种报表的后缀定为 RDLC RDL 仍然是 Report Definition Language 的缩写 那么 C 代表什么呢 C 代表 Client side processing 凸显了它的客户端处理能 力 这种报表的易用性和可定制性让我们完全有理由放弃 Crystal Report 让我们来 看看它的强大功能吧 1 简单易用的控件 特别是 Table 控件 非常方便字段在报表上的排列 2 灵活的可定制性 用 XML 来描述一个报表相关的一切 不用说了吧 3 高度可编程性 在你的项目中 甚至不需要有一个报表文件 通过代码就可以实现报表 生成 预览和打印等一系列操作 4 支持 DrillThrough 数据钻取功能 5 导出的 Excel 文件格式非常完美 任何其它报表在这方面都不能与之比拟 而且并不需 要安装 Excel 偷偷懒 其实我并不擅长总结某某的特点 我只能从实际经验中得到一 点点结论 而且我也不原意去抄袭帮助中的 New Features 呵呵 在以后的几篇随笔中 我将结合最近一段时间使用 RDLC 报表的经验继续探讨 相关的一些问题 大致内容包括 报表设计器的使用 LocalReport 的一些相关操作 如 何自定义纸张等等 欢迎大家提出参考意见 二 需要说明的是 现在关于 VS NET 2005 中的 Report Viewer Control 的内容 非常少 我只能按照自己的理解来说一些东西 这其中肯定会有一些偏差 欢迎各位的批 评指正 另外 我所涉及的内容都是关于 LocalReport 的 对于 ServerReport 没有进行研 究 在这篇随笔中 我主要分析一下 GotReportViewer 上的几个经典例子 我们可以从中看到 ReportViewer Control 的强大功能 1 Web Log Analyzer 这是一个比较典型的 OLAP 应用 我们可以看到 RDLC 报表强大的 Chart 和 Nav igation 功能 当然了 例子中解析 W3C 标准日志文件的代码也非常有借鉴意义 这个 Sta rter Kit 在我的随笔 中 曾经提到过 不再详述 2 子报表 展示如何使用子报表显示主记录的详细信息 这种应用很像 Access 中的子报表功 能 主要使用 SubreportProcessing 事件为子报表提供数据 3 钻取报表 钻取报表是通过设置 Navigation HyperLink 和 Parameters 来实现的 通常在 OL AP 应用程序中很有用 4 具有子报表的钻取报表 这个例子实现的功能类似 Excel 中数据透视表 Pivot Table 的功能 在一个复杂 的交叉表中可以进行时间和商品两个维度的向下钻取 这在别的报表中恐怕是很难实现的 如图所示 5 引用外部代码块 此示例演示从另外一个类 Util 中读取函数返回值到报表中 首先 使用 LocalR eport 的 AddTrustedCodeModuleInCurrentAppDomain 方法允许 Util 类中的方法在 Report Viewer 中执行 然后在报表中使用 TextBox 控件的 Value 节点调用 Util 中的静态方法 Fac torial 在报表中显示其返回值 另外一个相关的示例基本上与此相同 只不过在 Util 类中访问一个文本文件并将 该文本文件中的字符显示在报表中 6 导出到 Excel RDLC 报表导出到 Excel 中的效果非常好 曾经看到另外一个报表设计器 好像就 是 Crystal Report 导出为 Excel 文件后的效果非常差 单元格根本不对齐 用户无法在 其基础上进行二次操作 而 RDLC 报表导出的 Excel 文件就没有这个缺点 而且基本上完全 保留了原报表设置的格式 如图所示 可以直接使用 Report Viewer 控件自带的按钮生成 Excel 文件 也可以使用如下 代码来完成操作 Microsot Reporting WinForms Warning Warnings string strStreamIds string strMimeType string strEncoding string strFileNameExtension byte bytes this rptViewer LocalReport Render Excel null out strMimeTy pe out strEncoding out strFileNameExtension out strStreamIds out Warnings string strFilePath D report xls using System IO FileStream fs new FileStream strFilePath FileMode Create fs Write bytes 0 bytes Length 对于 LocalReport 的 Render 方法 以后的随笔中将进行详细阐述 7 交互排序 在 RDLC 报表的众多交互功能中 这个功能是比较新颖的 终端用户可以通过报表 中列标题上的图标进行数据的排序 而预览及打印的效果完全取决于用户的排序 此处好 像有一个 Bug 即对数据进行一种排序后的预览效果会保持不变 除非再次开启这个应用 程序并重新排序 而这一切不需要在代码中做任何操作 只需要在报表定义文件中添加节并指定相应的 SortExpression 和 SortExpressionScope 8 RSS 新闻阅读器 用 ReportViewer 实现 RSS 新闻阅读器 是的 如图所示 当然这个 sample 是为了展示对 Object 类型数据源的支持 报表参数 ReportPara meter 的使用也在其中得到体现 9 允许钻取的主子表 另外一种允许向下钻取的主子报表 如图所示 10 从命令行中打印报表 RDLC 报表允许用户不通过 ReportViewer 图形界面直接使用代码控制输出和打印 还是使用 LocalReport 的 Render 方法 以后的随笔中将参照这个示例介绍一个如何自定 义纸张的方法 11 票据生成 这个示例允许用户输入一个单据及其明细后直接生成一个可供打印的票据 如图 所示 12 动态生成一个 RDLC 文件 这可能是一个最最重要的示例了 RDLC 文件是用 XML 来描述的 可以直接使用代 码生成之 这样的报表就可以非常灵活了 像网上比较流行的从 DataGridView 直接预览 打印数据的程序完全可以用这种方法来替代 进一步引申的话 完全可以实现一个自己的 基于 RDLC 的报表设计器 这样可以让终端用户参与到报表的设计中 至少可以使他们能够 修改报表中一些标题 表头等 GotReportViewer 还提供了几个其他的例子 如设置报表参数 通过 Email 邮寄 报表等 由于不是非常典型 不再赘述 GotReportViwer 不知道为什么最近上不去了 有需要这些例程的朋友可以留下 Em ail 三 仔细想了一下 我觉得一篇 step by step 的随笔似乎是不必要的 由于 RDLC 报表设计时 的简易性 任何有报表经验的人都可以在摸索后很容易就掌握其报表的设计方法 本来在 这篇随笔中想谈一下对 RDLC 报表文件的解析 但是 MISGoldPrinter 的作者 flygoldfish 长流支流 已经对这方面进行了详细的总结 见 rchive 2005 12 16 554035 aspx 长江支流对报表非常有研究 建议大家到他的 Blog 上看看 不过我觉得他实现的金质打印通完全可以用 RDLC 报表中的内容所替代 这只是个 人意见 希望以后能见到他的更多作品 另外 我手头有一份 RDL 规范 Report Definition Language Specification 非常值得阅读 推荐给大家 截图 Matrix Table 本来打算不要这篇随笔了 因为没有什么具体的内容 但为了保证完整性 还是 放在这吧 不过我不放在首页了 免得污染大家的视线 呵呵 下一篇随笔可能是关于 Table 和 Matrix 这个两个控件的 不过我还没具体想好 四 RDLC 报表中有一个概念叫数据区域 Data Region 数据区域是数据绑定的报表项目 在数据区域中可以显示来自数据集的多行数据 RDLC 报表设计器中的数据区域包含控件面 板上的一系列控件 List Table Matrix Chart 如图所示 List 控件的用处在于这是一个在其中可以自由安排像 TextBox Image 等控件 C hart 控件用于显示图表 和 Excel 中的图表比较相似 这篇随笔不会涉及到这两个控件 主要讲一下 Table 和 Matrix 两个控件 先来看 Table 控件 Table 控件有多个部分组成 如标题行 header 表尾 foot er 数据行 detailed rows 分组表头 group header 分组表尾 group footer 等 如图所示 之所以设计这样一个控件 我想 Microsoft 一定是在简化报表的设计 在这个控件未出现之前 我们看一下一个具有 heaer detailed rows 和带统计信 息的 footer 的报表时如何实现的 首先 这个报表需要显示报表页眉 主体和报表页脚三 个部分 然后在报表页眉中拖曳进一系列 Label 形成表格的标题行 接着在主体部分拖曳 进一系列 TextBox 用于显示数据行 并在报表页脚中拖曳进一系列 Label 或 TextBox 用于 显示统计信息 要命的是 这些 Label 或 TextBox 需要在某个方向上进行对齐 控件宽度 的调节也非常麻烦 如果需要显示表格线 那么没办法 需要使用 Line 控件手工画 这是 非常麻烦的一件差事 相信没人会喜欢用这么麻烦的方法来设计这么一个简单的报表 现在 Microsoft 推出了 Table 控件 你需要做的只是确定表格的列数 因为表 格的列数需要是固定的 然后将字段从 Data Sources 面板中拖曳到 Table 控件的数据行 中就可以了 报表设计器会自动为你生成标题行中的标题信息 至于 footer 中的统计信息 Microsoft 甚至为我们设计了一个表达式生成器 使用起来非常简便 列宽可以通过拖曳 来调整 表格线可以通过设置 Table 控件的属性来完成 是的 一切就是这么简单 这也很可能是为什么你在 Visual Studio 2005 的报表 设计器中找不到报表页眉和报表页脚的原因 只有页面页眉 page header 和页面页脚 pag e footer 就足够了 当然 可能报表中也需要不是像表格这么整齐排列的数据区域 这时候就需要用 到 List 控件了 在实际应用中 发现一个表格控件可以具有零个 一个或多个 header 或 footer 甚至可以没有 detailed rows 这样的表格控件有什么作用呢 我们知道 detailed rows 是用来显示多行数据的 而 heaer 或 footer 都可以用来显示 sum count 等统计信息 假 如我们的数据集中同时具有主子表 如通过 Inner Join 获得的一个查询 的信息 而这时 候我们需要将主报表的信息单独显示出来使整个报表形成一个主子表的样式 那么我们就 可以用到没有 detailed rows 的 Table 控件了 为 header 或 footer 中的单元格指定 Firs t Fields 字段名称 Value 数据源名称 就可以了 这样至少减少了我们排列这些字段 信息的烦恼 也就是说 Table 控件是非常灵活的 CodeProject 上有一篇文章 One to Ma ny Reports with VS NET 2005 2 0 Report Designer tnet 1tomanyreports vsnet2005 asp 即是用这种主子数据集显示的主子报表 但是个人 觉得不如上面描述的方法来的简单 顶多给报表增加一个可以标识主记录的参数而已 当 然 正儿八经的主子报表还是需要借助 SubReport 控件来实现 再来看一下 Matrix 控件 这个控件可以看作是 Microsoft 的又一个创新 以前的 报表中可能会有交叉表 crosstab 但 Matrix 控件反映的不只是一个交叉表 还可以看作 是一个带钻取功能的数据透视表 pivot table Matrix 控件由以下部分组成 如果由我们自己使用一个普通的数据集来绘制一个 crosstab 那会是一个非常麻 烦的工作 我们需要 为数据透视报表设置行标题 计算可能的列标题数量并设置列标题 根据行标题和列标题在数据集中循环查询由当前行标题和列标题决定的值 整个过程的 计算量就够受的了 作为被 Microsoft 封装过的一个控件 Matrix 控件显然不需要这么麻 烦 简单的拖曳操作并设置其属性就可以了 当然 在报表中使用交叉表最重要的一点是 最终显示的结果必须是有意义的 需要注意的是 当包含 Matrix 控件的报表导出到 Excel 文件中以后 即使是未显 示的带有钻取标志的区域也将被显示出来 可能你会有这样的疑问 既然是数据透视表 为什么在 Excel 中不能显示成折叠的样式呢 这是因为报表的导出功能是并不依赖于 Exce l 的 下一篇随笔可能是关于 ReportViewer 控件的 五 随着 Visual Studio 2005 中文版的推出 Microsoft 汉化了 MSDN 的大部分内容 开发者 再也不用啃英文了 本来想介绍一下 LocalReport 的 Render 方法 现在您可以到 http 获得关于这部分的详细信息 之所以以前想介绍这个方法 是因为我将想大家介绍一种在 Crystal Report 中无法实现 的自定义票据打印纸张的方法 Anyway 现在我直接向大家介绍这种方法 可能这种方法 并不是很好的 但是确实是我经过一段时间的摸索总结出来的 萝卜 b 曾经提到过的变通的方法不知道是不是我要介绍的这一种 欢迎和我进行交流 要想使用 RDLC 报表并进行页面设置 我们先来看一下 LocalReport 是否有类似 P ageSettings 的类 属性 方法或事件等 我仔细找了一下 发现 Microsoft Reporting W inForms ReportPageSettings 类具有 PaperSize 属性和 Margin 属性 但可惜的是它们都 是只读的 对我们来说没有意义 另外 LocalReport 具有 GetDefaultPageSettings 方 法 这也只能是获取当前报表的页面设置 没办法 只能采用变通的方法了 在 NET 中如 果想使用自定义纸张 最好的方法莫过于使用 System Drawing Printing PrintDocument 类了 还记得我在前面提到的一个 GotReportViewer 的例子吗 private int m currentPageIndex private IList m streams private Stream CreateStream string name string fileNameExtension Encodi ng encoding string mimeType bool willSeek Stream stream new FileStream name fileNameExtension FileMo de Create m streams Add stream return stream private void Export LocalReport report string deviceInfo EMF 8 5in 11in 0 25in 0 25in 0 25in 0 25in Warning warnings m streams new List report Render Image deviceInfo CreateStream out warnings foreach Stream stream in m streams stream Position 0 private void PrintPage object sender PrintPageEventArgs ev Metafile pageImage new Metafile m streams m currentPageIndex ev Graphics DrawImage pageImage ev PageBounds m currentPageIndex ev HasMorePages m currentPageIndex m streams Count private void Print const string printerName Microsoft Office Document Image Writer if m streams null m streams Count 0 return PrintDocument printDoc new PrintDocument printDoc PrinterSettings PrinterName printerName if printDoc PrinterSettings IsValid string msg String Format Can t find printer 0 print erName Console WriteLine msg return printDoc PrintPage new PrintPageEventHandler PrintPage printDoc Print private void Run LocalReport report new LocalReport report ReportPath Report rdlc report DataSources Add new ReportDataSource Sales LoadSalesData Export report m currentPageIndex 0 Print 对 就是那个通过命令行而不是 ReportViewer 的 GUI 界面进行打印报表的例子 这个例子就使用 LocalReport 的 Render 方法将报表的内容导出为 EMF 图像流 然后在 Pri ntDocument 的 PrintPage 事件中使用时事件参数 System Drawing Printing PrintEventAr gs 类的 DrawImage 方法将 EMF 图像流输出到打印机 我在上面说的变通的方法也要使用这 种方法 具体的细节将在以后的随笔中陆续给出 既然我们使用这种方法进行报表的打印 那么 Visual Studio 的控件 ReportView er 的工具栏就不再符合我们的要求了 因为这个报表浏览器的工具栏上的按钮虽然可以设 置属性显示或隐藏其中的一部分 但是我们却不能自己往这个工具栏上添加按钮 显然 我们需要实现自己的页面设置 预览和打印按钮 在这一点上 建议 Microsoft 将工具 栏和报表浏览器分离 应该做得和 BindingNavigator 那样就好了 我们先设置 ReportViewer 控件的 ShowToolBar 方法为 false 然后在 ReportView er 控件纸上添加除页面设置 预览 打印外的应该有的按钮 像刷新 终止 导出 缩放 搜索 导航等 这些按钮的 Click 事件定义如下 获取当前时间组成的字符串 用作生成不会重复的文件名 private string GetTimeStamp string strRet string Empty System DateTime dtNow Pub DateTimeEx ServerTime strRet dtNow Year ToString dtNow Month ToString 00 dtNow Day ToString 00 dtNow Hour ToString 00 dtNow Minute ToString 00 dtNow Second ToString 00 System DateTime Now Millisecond ToString 000 return strRet 导出到 Excel private void toolExcel Click object sender EventArgs e Microsoft Reporting WinForms Warning Warnings string strStreamIds string strMimeType string strEncoding string strFileNameExtension byte bytes this rptViewer LocalReport Render Excel null o ut strMimeType out strEncoding out strFileNameExtension out strStreamIds ou t Warnings string strFilePath D this GetTimeStamp xls using System IO FileStream fs new FileStream strFilePath File Mode Create fs Write bytes 0 bytes Length if Pub WinForm Msg Question 报表打印 r n 成功导出 Excel 文 件 strFilePath r n 要现在打开文件 strFilePath 吗 Dialo gResult Yes System Diagnostics Process Start strFilePath 刷新报表数据 private void tool 刷新 Click object sender EventArgs e this rptViewer RefreshReport 在加载报表数据时终止报表数据的加载 private void tool 终止 Click object sender EventArgs e this rptViewer CancelRendering 0 从 DrillThrough 报表返回到导航页面 private void tool 返回 Click object sender EventArgs e if this rptViewer LocalReport IsDrillthroughReport this rptViewer PerformBack 回到报表的第一页 private void tool 第一页 Click object sender EventArgs e this rptViewer CurrentPage 1 跳转到报表的最后一页 private void tool 最后一页 Click object sender EventArgs e this rptViewer CurrentPage this rptViewer LocalReport GetTotalP ages 以 25 的比例显示报表 private void tool25 Click object sender EventArgs e this rptViewer ZoomMode ZoomMode Percent this rptViewer ZoomPercent 25 以 50 的比例显示报表 private void tool50 Click object sender EventArgs e this rptViewer ZoomMode ZoomMode Percent this rptViewer ZoomPercent 50 以 100 的比例显示报表 private void tool100 Click object sender EventArgs e this rptViewer ZoomMode ZoomMode Percent this rptViewer ZoomPercent 100 以 200 的比例显示报表 private void tool200 Click object sender EventArgs e this rptViewer ZoomMode ZoomMode Percent this rptViewer ZoomPercent 200 以 400 的比例显示报表 private void tool400 Click object sender EventArgs e this rptViewer ZoomMode ZoomMode Percent this rptViewer ZoomPercent 400 将缩放模式设置为整页 private void tool 整页 Click object sender EventArgs e this rptViewer ZoomMode ZoomMode FullPage 将缩放模式设置为页宽 private void tool 页宽 Click object sender EventArgs e this rptViewer ZoomMode ZoomMode PageWidth 在报表中搜索 txtSearch 中的字符 private void tool 搜索 Click object sender EventArgs e if this txtSearch Text Trim string Empty return this rptViewer Find this txtSearch Text Trim 1 搜索报表中下一处 txtSearch 中的字符 private void tool 搜索下一个 Click object sender EventArgs e if this txtSearch Text Trim string Empty return this rptViewer FindNext 跳转到上一页 private void tool 上一页 Click object sender EventArgs e if this rptViewer CurrentPage 1 this rptViewer CurrentPage 跳转到下一页 private void tool 下一页 Click object sender EventArgs e if this rptViewer CurrentPage this rptViewer LocalReport GetT otalPages this rptViewer CurrentPage 跳转到由 txt 跳转中指定的页数 private void tool 跳转 Click object sender EventArgs e if this txt 跳转 Text Trim string Empty return int intJump 0 if System Int32 TryParse this txt 跳转 Text Trim out intJump if intJump this rptViewer LocalReport GetTotalPages this rptViewer CurrentPage intJump 六 你可能已经注意到了在调用 LocalReport 的 Render 方法时用到了一个 XML 格式的 DeviceI nfo 结构 在 SQL Server 2005 Report Services 中 DeviceInfo 结构是为了给特定的呈 现格式传递参数 来看一个简单的 DeviceInfo 结构 EMF 21cm 29 70cm 2cm 2cm 2cm 2cm 这个简单的 DeviceInfo 结构至少为 LocalReport 的 Render 方法指定了输出格式 页宽 页高 左边距 右边距 下边距信息 在我们使用 PrintPage 的方法将 LocalRep ort 呈现为 EMF 图片时 EMF 图片在页面上显示的大小 边距就是由这个 DeviceInfo 结构 来决定的 如果为 DeviceInfo 结构和 PrintDocumnt 设置不匹配的页面大小或边距 那么 在 PrintPage 事件中使用 DrawImage 方法画出的图片将出现放大或缩小的情况 这是我们 不愿意看到的结果 也就是说 在使用自定义纸张进行单据打印时 我们不仅要为 PrintD ocument 设置页面大小和边距 还要为 LocalReport 设置与 PrintDocument 相同的页面大 小和边距 关于 DeviceInfo 的结构 可以参考 ary ms155373 aspx 下面是我封装的一个为生成 DeviceInfo 结构使用的类 using System using System Collections Generic using System Text namespace RDLCReport public class EMFDeviceInfo private bool m Landscape false public bool Landscape get return this m Landscape set this m Landscape value The pixel depth of the color range supported by the image output Valid values are 1 4 8 24 and 32 The default value is 24 ColorDepth is only supported for TIFF rendering and is otherwise i gnored by the report server for other image output formats Note For this release of SQL Server the value of this setting is ignor ed and the TIFF image is always rendered as 24 bit 默认值为 24 且只有当输出格式为 TIFF 时才该项设置才起作用 private int m ColorDepth 24 public int ColorDepth get return this m ColorDepth The number of columns to set for the report This value overrides the report s original settings 未用到此项设置 private int m Columns 0 public int Columns get return this m Columns set this m Columns value The column spacing to set for the report This value overrides the report s original settings 未用到此项设置 private int m ColumnSpacing 0 public int ColumnSpacing get return this m ColumnSpacing set this m ColumnSpacing value The resolution of the output device in x direction The default va lue is 96 解析度 默认值为 96 private int m DpiX 96 public int DpiX get return this m DpiX set this m DpiX value The resolution of the output device in y direction The default va lue is 96 解析度 默认值为 96 private int m DpiY 96 public int DpiY get return this m DpiY set this m DpiY value The last page of the report to render The default value is the va lue for StartPage 要输出的报表的最后一页 private int m EndPage 0 public int EndPage get return this m EndPage set this m EndPage value The first page of the report to render A value of 0 indicates tha t all pages are rendered The default value is 1 起始页 代表所有页面都将输出 默认值为 private int m StartPage 1 public int StartPage get return this m StartPage set this m StartPage value The bottom margin value in inches to set for the report You mus t include an integer or decimal value followed by in for example 1in This value overrides the report s original settings 底部边距 必须加上单位如 in private decimal m MarginBottom 0 public decimal MarginBottom get return this m MarginBottom set this m MarginBottom value The top margin value in inches to set for the report You must i nclude an integer or decimal value followed by in for example 1in This va lue overrides the report s original settings 顶部边距 必须加上单位如 in private decimal m MarginTop 0 public decimal MarginTop get return this m MarginTop set this m MarginTop value The left margin value in inches to set for the report You must include an integer or decimal value followed by in for example 1in This v alue overrides the report s original settings 左边距 必须加上单位如 in private decimal m MarginLeft 0 public decimal MarginLeft get return this m MarginLeft set this m MarginLeft value The right margin value in inches to set for the report You must include an integer or decimal value followed by in for example 1in This value overrides the report s original settings 右边距 必须加上单位如 in private decimal m MarginRight 0 public decimal MarginRight get return this m MarginRight set this m MarginRight value One of the Graphics Device Interface GDI supported output format s BMP EMF GIF JPEG PNG or TIFF 图形设备接口 GDI 支持的一种输出格式 可以是 BMP EMF GIF JPEG PNG 或 TIFF 此处使用 EMF private string m OutputFormat EMF public string OutputFormat get return this m OutputFormat set this m OutputFormat value The page height in inches to set for the report You must includ e an integer or decimal value followed by in for example 11in This value overrides the report s original settings 页面高度 必须加上单位如 in private decimal m PageHeight 0 public decimal PageHeight get return this m PageHeight set this m PageHeight value The page width in inches to set for the report You must include an integer or decimal value followed by in for example 8 5in This value overrides the report s original settings 页面宽度 必须加上单位如 in private decimal m PageWidth 0 public decimal PageWidth get return this m PageWidth set this m PageWidth value 返回包含 DeviceInfo 的字符串 public string DeviceInfoString get string strRet string Empty strRet this m OutputFormat if this m Landscape strRet this m PageHeight ToString cm this m PageWidth ToString cm else strRet this m PageWidth ToString cm this m PageHeight ToString cm strRet this m MarginTop ToString cm this m MarginLeft ToString cm this m MarginRight ToString cm this m MarginBottom ToString cm strRet return strRet 好了 解决了 DeviceInfo 现在来看一下如何在 PrintDocument 的 PrintPage 事 件中向打印机输出由 LocalReport 呈现的 EMF 图片 使用的方法基本上就是在 GotReportV iewer 的例程 Print a report from a console app 中使用的方法 但是需要指出的一点 是例程中使用事件参数 System Drawing Printing PrintPageEventArgs 类的 Graphics 属 性的 DrawImage 方法向打印机输出 EMF 图片 在实际的应用中 发现 DrawImage 方法绘出 的图片会出现放大或缩小的情况 即使为 DrawImage 方法指定了看起来正确的参数 ev Gra phics DrawImageUnscaledAndClipped this m PageImage ev PageBounds 我使用的方 法是 DrawImageUnscaledAndClipped 在为 DeviceInfo 结构和 PrintDocument 指定好适当 且匹配的页面设置时 输出的结果是比较好的 七 有关 LocalReport DeviceInfo 和 PrintDocument 的内容已经介绍得差不多了 稍后会给 出一个继承自 System Drawing Printing PrintDocument 的组件 EMFStreamPrintDocument 但是现在 来看一下如何进行自定义纸张票据打印时的页面设置 页面设置窗体如下图 所示 如何添加 删除自定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论