RDLC在不预览的情况下打印本地报表
关于VS2010RDLC报表的详细使用说明

关于VS2010RDLC报表的详细使⽤说明各位技术屌丝们好,之前我⽤了很长⼀段时间通过不断的研究揣摩,终于把RDLC报表给搞透了,今天跟⼤家做个总结,希望能够帮助到⼤家。
需求分析我想把datagridview 中的数据打印出来。
⾸先新建⼀个winfrom 窗体第⼆部将数据填充到datagridview中现在我要做的是把datagridview中的数据打印出来。
打印之前⾸先建⽴⼀个窗⼝,专门⽤于存放打印控件注意红⾊标记的地⽅,尤其是访问级别处最好给public 避免出现访问不了现象。
图解:新建俩个⽂件夹。
report存放报表⽂件。
RDataSource存放数据源图解:新建⼀个数据源及⼀个报表⽂件。
新建⼀个数据表,主要⽤于报表上的传值。
由于我的数据源中只有俩个字段,所以在这⾥对于新增相同名称的字段,需要注意的是datatype这个地⽅,对于设置的数据类型新增表后会出现需要你选择数据源的地⽅,这个地⽅默认是引导新建,我们刚刚⼿动新增了我们的数据源所以这⾥我们选择以下图。
注意这是关键,不然你的数据获取不到。
⽤对象类型。
我们新增的数据源在对象⾥⾯会体现出来,需要注意的是只选择Rdataset (左)下⾯的不需要选择。
点击完成这⾥为了⽅便起见我起了跟数据源相同的名称。
这⾥数据源已经出来了,还有我们只新增了⼀个数据集(可⽤数据集)在dataset⾥⾯可以新增多个数据集,不过引⽤的时候需要注意下这⾥的可⽤数据集。
因为我们刚刚引⽤了数据源,所以在这⾥也已经有了。
报表的设置基本好了,这边报表的设计好不好看,完全取决于你的审美啦。
这⾥我们在datagridview中新增⼀个事件需要引⽤using Microsoft.Reporting.WinForms;基本到这⾥就算完成了,试着F5下吧。
直接打印即可啦!!!!花了⼀中午的时间做的教程,希望能够帮助到各位苦逼的程序员屌丝們,如果你看了对你有帮助的话同事也希望帮助到其他新⼿的话,请加⼊我们的群:28851380问题及处理⽅法找不到报表解决办法如果报表设置不是很⼤的话可以采⽤始终复制哦,如果很⼤的话就使⽤复制最新的。
报表设计器RDL报表操作指南

葡萄城报表提供了一个高度集成的设计器,并以可视化、代码、脚本或表达式的方式来编 辑报表。它包括一个属性窗口,可以在该窗口中设置每个元素的属性。
设计器支持三种类型的报表:RDL报表、页面报表、区域报表。本章介绍RDL报表的具体 操作。
1. RDL 报表
Rdl报表给我们提供了最大限度的报表交互能力。可以放大和缩小控件,设置交互式排序, 设置钻取报表,还可以添加指向其它报表的钻取链接和指向报表内其它区域的书签链接。下面 详细介绍RDL报表。
文本框 文本框用于显示报表数据,Table 和 Matrix 单元格中默认显示的是文本框控件,当您从报 表资源管理器中将数据字段拖拽到报表界面时,生成的也是文本框控件。您可以通过表达式来 修改数据的显示行为。
1.5 属性窗口
在设计报表时,属性窗口是非常重要的工具。可以选择任何数据区域、控件或报表本身并 在属性窗口中查看其属性。默认情况下,此窗口位于报表设计区域的右侧。您可以通过单击属 性窗口顶部的“按字母顺序”或“按类别顺序”显示属性列表。
列表 列表中可以放置其他报表控件。它会根据数据集中的数据重复地显示区域内的控件。 距表 距表支持动态数量的行和列。此功能与交叉表和数据透视表类似。 形状 形状不与具体的数据关联。可用于显示一个控件的边界,或者高亮显示报表中特定区域的 数据,支持的形状有矩形,圆角矩形和椭圆。与Container不同的是,该控件内不能放置其他 控件。 迷你图 迷你图以一个很小的图像来展示数据的趋势,支持折线、面积、堆积条形、柱状和须状图 表类型。 子报表 子报表以子报表的形式显示其他报表的内容。可以从主报表中将参数传递给子报表以实现 数据过滤。需要注意的是每个子报表都以单独的报表运行,当处理大数据报表时,这种方案可 能会影响到运行的速度,这种情况下,数据区域是更为合理的选择。 表格 表格以行为单位进行数据显示。默认情况下,表格有三行、三列。表格列的设置是在设计 时完成,行会根据数据集中的数据进行重复显示。表格默认会显示表头、明细和表尾,表头和 表尾和删除,此外您还可以添加/删除分组头和分组尾,表格的单元格默认包含一个文本框控 件,不过您可以将文本框控件替换为其他任意类型的报表控件。 文档目录 用于制作报表目录。 地图 用于制作地图报表。
C#中使用RDLC报表

C#中使⽤RDLC报表转⾃:1 建⽴数据源启动VS2005新建⼀个窗体项⽬,命名为TestProj在左边的窗体内选择“添加新数据源”或在菜单上操作“添加新数据源”:选择后出现对话窗体,选择“数据库”,进⼊“下⼀步”:本数据源以SqlServer2000所提供的Northwind数据库为例,因此在数据库内选择驱动程序为SqlServer,具体操作视所⽤数据库⽽定(如果连接为Oracle,建议⽤Oracle所提供的ODP for .NET,地址:)。
选择数据源后,指定数据库⽂件,并进⾏测试,如果连接不通,请检查你的软件设置。
进⾏下⼀步,⾄显⽰出库⽂件内的表及视图,然后打开表,并选择其中的Employees,选择完成。
在数据源窗⼝中显⽰出所选择表及表内的字段,以备使⽤。
同时在资源管理器中,也可以看到新增加的数据⽂件。
2 报表浏览器在新建的窗体内,放⼊报表浏览控件:此报表浏览控件集成了报表查看及打印预览的功能,可直接输出⾄打印机,也可直接输出⾄Excel⽂件或PDF⽂件,对于喜欢看Excel表格的客户来说,这个报表控件⾮常不错。
关于此报表的来源及台前幕后的各种说法,请⾃⼰查询相关的⽹站。
3 建⽴报表⽂件选中报表浏览器控件后,在控件的右上⾓会出现⼀个⼩三⾓,点击后,出现⼀个菜单,选择“设计新报表”或在解决⽅案资源管理器中添加⼀个新的报表⽂件:双击“报表项”内的“表”,则设计空⽩表内⽣成⼀个表格,我们可以在表格内添加数据项。
此报表的设计⽅式类似于MS以前的VB下报表设计环境。
在报表设计器中,我将⼀份报表分为五个部分,从上⾄下为:报表标题区、列标题区、数据显⽰区、合计及页脚。
如果将报表的设计形式显⽰出页眉及页脚,报表的形式会看得更清楚些:选择页眉及页脚:显⽰结果:现在开始设计报表:在“页眉”区内放⼊⼀个⽂本框,将内容更改为“测试报表”,居中,字体放⼤加粗:从数据源窗⼝中选择合适的列,⽤⿏标拖到报表内的“详细信息”表格上,数据会⾃动填⼊:将设计的报表保存后,返回报表浏览窗⼝,并为报表浏览器选择我们设计的报表:选中报表⽂件后,菜单也有所改变:再为此报表⽂件指定数据源,选择数据源:确定,保存⽂件并运⾏测试⽂件。
RDLC报表

RDLC报表1.1简介在visual studio 2005之前,微软提供了一个报表服务(Reporting Service),其中也提供了报表自定义语言Report Definition Language, RDL语言),其报表定义为.rdl文件;Microsoft提供了针对这种报表的设计器,并且提供了在并提供了在WinForm和WebForm中使用这种报表的能力.微软定义了RDLC (Report Definition Language Client)也就是报表定义语言的客户端也称本地报表,该报表的后缀为.rdlc.本地报表和服务器报表存在一定的区别。
服务器报表rdl是指那些针对报表服务部署在服务器端的报表。
当报表被许多用户访问、报表以发布在报表服务器上,将其包含在所创建和部署的应用程序中、报表中有复杂的查询或者包含数据量大导致应用程序所在计算机的系统资源超载时,用报表的远程处理比较合适。
本地报表rdlc是指在本地的一些报表,在使用报表不一定要依赖于SQL Server,而是可以自主生成一些数据源然后以报表的方式显现出来。
本地处理模式的功能不及远程处理功能强大,适合中小型好报表和数据集的应用程序。
如果和rdl比较,rdlc可以看成是一个轻量级的报表。
在展现报表的时候我们需要使用到的一个控件叫ReportViewer,这种控件可以展现rdl报表,也可以展现rdlc报表。
从其属性可以看出,ReportView.ServerReport是针对rdl报表的,而ReportViewer.LocalReport是针对rdlc报表的。
1.2RDLC功能RDLC报表提供了以下主要功能:1、含有简单易用尤其是Table控件,非常方便字段在报表上的排列。
2、灵活的可定制性,用XML来实现通用的报表打印,可以用XML完全可以实现一个基于RDLC的报表设计器,这样可以让终端用户参与到报表的设计中,至少可以使他们能够修改报表中一些标题、表头等3、高度可编程性,在你的项目中,甚至不需要有一个报表文件,通过代码就可以实现报表生成、预览和打印等一系列操作;4、支持数据钻取功能;钻取报表是通过设置Navigation(HyperLink)和Parameters 来实现的,而具有子报表的钻取报表实现的功能类似Excel中数据透视表(Pivot Table)的功能,在一个复杂的交叉表中可以进行时间和商品两个维度的向下钻取。
RDLC报表使用手册

RDLC使用总结1、为什么要使用RDLC报表(简介)VS .NET开发中,用什么进行报表设计?可能的回答是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中,Microsoft提供了针对这种报表的设计器,并提供了在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;6)数据源处理极其方便,开发人员可以自己接管数据库连接、取数,然后将数据结果赋值给RDLC的数据集即可。
VS2010_RDLC自带报表使用手册

RDLC使用总结1、为什么要使用RDLC报表(简介)VS .NET开发中,用什么进行报表设计?可能的回答是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中,Microsoft提供了针对这种报表的设计器,并提供了在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;6)数据源处理极其方便,开发人员可以自己接管数据库连接、取数,然后将数据结果赋值给RDLC的数据集即可。
RDLC报表实例

RDLC 报表开发一、打开Visual Studio 2005,新建 网站,添加数据集,会自动调出数据集配置窗口TableAdapter如果上面的窗口没有自动调出,可以如下图可以调出上面的TableAdapter 窗口二、新建立数据库连接下面的这一步会将数据库连接保存到config 文件中下面的这一步可以,选择生成SQL的方式让我们先回到SQL Server Query Analyzer打开SQL Server 查询分析器在SQL程序中创建如下图的存储过程然后回到V isual Studio 2005,选择使用现在的存储过程,下一步,在这里,我们只需要选择所需要的存储过程,如刚才建立的EmployeeReport 即可完成TableAdapter向导的配置三、添加报表项创建报表项后,从左边工具栏拖动一个Table 到报表设计器中,选择网站数据集中的字段,把它拖动到表格的列中,通过页眉页脚可以设置复杂的打印样式。
四、新建立一个ASPX页面,拖动一个Report V iewer控件到页面中,在ReportViewer任务窗口中,选择刚才建立的rdl c文件,生成解决方案,然后执行就完成了报表开发。
[ 注意:如果此处报“未能找到在ObjectDataSource ObjectDataSource1 的TypeName 属性中指定的类型”的错误,说明数据源配置不正确,可以选择正确的配置即可。
]五、注意1. 刚才的SQL 脚本CREA TE PROC EmployeeReportASSELECT * FROM EmployeeGO实际的报表开发中,一定不要用SELECT * ,只取报表中需要查看的字段。
2. 有时候,可能需要用户选择一些条件,有选择性的查看报表。
而不是全部绑定数据如上图,用户可能只需要查看2008-9-29至2008-9-30时间段之间的数据则作法如下:先建立好如上图的ASPX页面,在View Report 事件中写如下的程序ReportViewer1.LocalReport.ReportPath = AppDomain.CurrentDomain.BaseDirectory + "/Report/Request.rdlc";DateTime dtFrom =Convert.ToDateTime(txtDateFrom.Text);DateTime dtTo =Convert.ToDateTime(txtDateTo.Text);string requester = txtRequester.Text;string dept = txtRequestDept.Text;string material = ddlMaterial.SelectedV alue;string iprstatus = ddlStatus.SelectedV alue;DataTable reqrpt = ReportDB.RequestReport(dtFrom, dtTo, material, dept,requester, iprstatus);if (reqrpt != null){ReportViewer1.LocalReport.DataSources.Clear();ReportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("Request_RequestReport", reqrpt)); ReportViewer1.LocalReport.Refresh();}ReportViewer1.LocalReport.Refresh();根据用户所选的参数,把数据值传到SQL语句中即可.下面是RequestReport方法的源码DataTable RequestReport(DateTime dtFrom, DateTime dtTo, string pMaterial, string pDept, string pRequester, string pIPRStatus) {string MySQL = Purchase;string whDate = " RequestDate BETWEEN '{0}' AND '{1}' ";MySQL = MySQL + string.Format(whDate, dtFrom, dtTo);string whMaterial = " AND MaterialCode='{0}' ";if (pMaterial != "ALL"){MySQL = MySQL + string.Format(whMaterial, pMaterial);}string whDept = " AND RequestDepartment='{0}' ";MySQL = MySQL + string.Format(whDept, pDept);string whRequester=" AND Requester='{0}' ";if(pRequester!="ALL")MySQL = MySQL + string.Format(whRequester, pRequester);string whIPRStatus = " AND IPRStatus={0} ";if (pIPRStatus != "ALL"){MySQL = MySQL + string.Format(whIPRStatus, pIPRStatus);}IDataProvider privider = DataProvider.CreateDataProvider();DataSet ds = privider.RetriveDataSet(MySQL);if (ds != null && ds.Tables.Count > 0)return ds.Tables[0];elsereturn null;}const string Purchase="SELECT SerialNO,LedgerAcc,CostCenter,Requester,"+" RequestDate,RequestDepartment,MaterialCode, " +" Brand,Specifications,Unit,Quantity,Usage, "+" ExpectedDeliveryDate,Currency "+" ,Quotation1Supplier,Quotation1UnitPrice,Quotation1Amount, "+" Quotation2Supplier,Quotation2UnitPrice,Quotation2Amount, "+" Quotation3Supplier, Quotation3UnitPrice, Quotation3Amount, "+" ProposedQuotationSupplier, ProposedQuotationUnitPrice, "+" ProposedQuotationAmount,QuotationRemarks ,IPRStatus,QtyTo, UnitPriceTo FROM IPR WHERE ";3. 设计报表时,可以用上述的方法,实际运行时,可以替换成SQL 语句,传到ReportDataSource中即可,只要相应的表结构字段是存在的。
RDLC报表

RDLC报表使用步骤主要介绍使用业务对象数据进行报表设计的过程。
(1)在项目上右击,添加报表。
(2)打开报表属性对话框(3)添加Model程序集引用(4)重新生成Model,这样的话,点击菜单上的“数据”,才会有添加数据新数据源和显示数据源项。
(5)若界面上没报表数据工具条,则点击菜单上的视图,报表数据,这样就调出了报表数据工具条。
若界面上有的话,此步省略。
(6)在菜单上选择数据,添加数据源,在弹出的对话框选择对象,然后即可选择Model 下的字段了。
(7)在报表工具表上,点击新建,添加数据集,弹出对话框,给数据集命名,并选择相应的Model。
(8)到此为止就可以报表的设计了。
报表的布局,想怎么弄就怎么弄吧。
(9)报表设计好了,需要给一个浏览报表的窗口,提供这个功能的就ReportView控件,在工具箱中可以找到,托到一个Web页面上即可。
还要加一个”ScripManager”控件,这个控件是在AJAX Extensions项下面,只要托到页面上即可,不用管它了。
(10)接下来需要给ReportView控件配置数据源了。
有两种方法。
一种是像给GirdView、FormView选择数据源一样,点击ReportView控件右侧的三角形符号,弹出一个小窗口,选择新建数据源,选择对象,然后选择BLL下的方法即,这将自动将ObjectDataSource加入到这个页面来。
第二种方法,是通过手写代码来配置数据源,这种方法适应比较复杂的情况,比如你需要对List集合下的字段进行改动,再配置给ReportView。
后面我给了一小段代码,这段代码是如何将报表按照数据库中的址将图片加载到报表中的,很典型。
(11)这样就做好了,接下来是发布了。
(12)注意,发布后,必须将RDLC报表拷到发布的目录下,覆盖掉发布过程中生成的RDLC 文件(这个文件只有1K)。
存在的问题RDLC这种报表,不支持直接打印。
必须将报表导出到PDF WORD EXCEL中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
演练:在不预览的情况下打印本地报表Visual Studio 2012其他版本Visual Studio 2010Visual Studio 2008Visual Studio 2005此主题尚未评级 - 评价此主题本演练演示如何使用 LocalReport 对象和 CreateStreamCallback 回调函数以编程方式在不查看的情况下打印报表。
先决条件您必须具有访问示例报表和数据源的权限。
有关更多信息,请参见用于打印演练的示例数据和报表。
执行下列步骤可创建控制台应用程序项目。
创建新的控制台应用程序项目1. 在“文件”菜单上,指向“新建”,然后选择“项目”。
2. 在“已安装的模板”窗格中,选择“C#”或“VisualBasic”。
根据 Visual Studio 中的启动设置,“C#”或“Visual Basic”节点可能会显示在“其他语言”下。
3. 在“模板”窗格中,选择“控制台应用程序”。
4. 在“名称”框中,键入项目的名称:PrintLocalReport。
5. 在“位置”框中,输入要保存项目的目录,或者单击“浏览”以导航到该目录。
6. 单击“确定”。
项目与显示“Program”代码文件的“代码”窗口一起打开。
添加引用1. 从“项目”菜单中,选择“添加引用”。
2. 在“添加引用”对话框的“.NET”选项卡上,选择System.Drawing、System.Windows.Forms 和Microsoft.ReportViewer.Winforms。
3. 单击“确定”。
添加现有的 report.rdlc 和 data.xml 文件1. 从“项目”菜单中选择“添加现有项”。
随即将显示“添加现有项”对话框。
2. 定位到保存 report.rdlc 和 data.xml 的文件夹。
然后选择这两个文件。
3. 单击“添加”。
这两个文件将作为项目的一部分显示在解决方案资源管理器中。
添加代码1. Program 代码文件应该已经打开并处于待编辑状态。
如果该文件尚未打开,请在“解决方案资源管理器”窗口中双击Program.cs 或 Module1.vb 文件。
2. 根据您的编程语言选择下面的代码,并用其替换“Program”文件中的现有代码。
注意如果您的计算机上没有安装名为 Microsoft XPSDocument Writer 的打印机,请将粗体代码更改为您计算机上的指定打印机。
3. C#4. 复制5. using System;6. using System.IO;7. using System.Data;8. using System.Text;9. using System.Drawing.Imaging;10. using System.Drawing.Printing;11. using System.Collections.Generic;12. using System.Windows.Forms;13. using Microsoft.Reporting.WinForms;14.15. public class Demo : IDisposable16. {17. private int m_currentPageIndex;18. private IList<Stream> m_streams;19.20. private DataTable LoadSalesData()21. {22. // Create a new DataSet and read sales datafile23. // data.xml into the first DataTable.24. DataSet dataSet = new DataSet();25. dataSet.ReadXml(@"..\..\data.xml");26. return dataSet.Tables[0];27. }28. // Routine to provide to the report renderer, inorder to29. // save an image for each page of the report.30. private Stream CreateStream(string name,31. string fileNameExtension, Encoding encoding,32. string mimeType, bool willSeek)33. {34. Stream stream = new MemoryStream();35. m_streams.Add(stream);36. return stream;37. }38. // Export the given report as an EMF (EnhancedMetafile) file.39. private void Export(LocalReport report)40. {41. string deviceInfo =42. @"<DeviceInfo>43. <OutputFormat>EMF</OutputFormat>44. <PageWidth>8.5in</PageWidth>45. <PageHeight>11in</PageHeight>46. <MarginTop>0.25in</MarginTop>47. <MarginLeft>0.25in</MarginLeft>48. <MarginRight>0.25in</MarginRight>49. <MarginBottom>0.25in</MarginBottom>50. </DeviceInfo>";51. Warning[] warnings;52. m_streams = new List<Stream>();53. report.Render("Image", deviceInfo,CreateStream,54. out warnings);55. foreach (Stream stream in m_streams)56. stream.Position = 0;57. }58. // Handler for PrintPageEvents59. private void PrintPage(object sender,PrintPageEventArgs ev)60. {61. Metafile pageImage = new62. Metafile(m_streams[m_currentPageIndex]);63.64. // Adjust rectangular area with printermargins.65. Rectangle adjustedRect = new Rectangle(66. ev.PageBounds.Left -(int)ev.PageSettings.HardMarginX,67. ev.PageBounds.Top -(int)ev.PageSettings.HardMarginY,68. ev.PageBounds.Width,69. ev.PageBounds.Height);70.71. // Draw a white background for the report72. ev.Graphics.FillRectangle(Brushes.White,adjustedRect);73.74. // Draw the report content75. ev.Graphics.DrawImage(pageImage,adjustedRect);76.77. // Prepare for the next page. Make sure wehaven't hit the end.78. m_currentPageIndex++;79. ev.HasMorePages = (m_currentPageIndex <m_streams.Count);80. }81.82. private void Print()83. {84. if (m_streams == null || m_streams.Count ==0)85. throw new Exception("Error: no stream toprint.");86. PrintDocument printDoc = new PrintDocument();87. if (!printDoc.PrinterSettings.IsValid)88. {89. throw new Exception("Error: cannot findthe default printer.");90. }91. else92. {93. printDoc.PrintPage += newPrintPageEventHandler(PrintPage);94. m_currentPageIndex = 0;95. printDoc.Print();96. }97. }98. // Create a local report for Report.rdlc, loadthe data,99. // export the report to an .emf file, andprint it.100. private void Run()101. {102. LocalReport report = new LocalReport();103. report.ReportPath = @"..\..\Report.rdlc"; 104. report.DataSources.Add(105. new ReportDataSource("Sales",LoadSalesData()));106. Export(report);107. Print();108. }109.110. public void Dispose()111. {112. if (m_streams != null)113. {114. foreach (Stream stream in m_streams) 115. stream.Close();116. m_streams = null;117. }118. }119.120. public static void Main(string[] args)121. {122. using (Demo demo = new Demo())123. {124. demo.Run();125. }126. }127. }。