Web项目中使用RDLC报表可以打印吗?

   不断地有人在我的Blog上提出这样的问题——为什么在Web窗体中使用.rdlc报表时,ReportViewer控件上没有“打印”按钮?在WEB窗体的设计状态,默认情况下,ReportViewer控件上是没有“打印”按钮的;如果在“ReportViewer 任务”窗口中选择一个客户端报表(一个.rdlc文件),也是没有“打印”按钮的;如果在“ReportViewer 任务”窗口中选择的是服务器端报表,“打印”按钮就出现了(如图1所示)。


图1 “打印”按钮的出现与隐藏

   这个问题涉及到服务器端报表(对应RDL)和客户端报表(对应RDLC)的应用情境,对此,MSDN是这样解释的——

何时使用远程处理

基于服务器的报表功能为实现下列任务提供了方法:集中存储和管理报表、设置策略和确保对报表及文件夹的安全访问、控制处理和分布报表的方式,以及设置在业务中使用报表的标准方式。Reporting Services 可以以单服务器、分布式和群集配置的方式进行安装。如果报表具有下列特征,请考虑使用远程处理:

  • 报表将被许多用户访问。
  • 报表有一个非常复杂的查询或包含大量数据,从而导致应用程序所在的计算机上的系统资源超载。
  • 报表已发布在报表服务器上,并且希望将其包含在所创建和部署的应用程序中。

——将 ReportViewer 配置为进行远程处理



何时使用本地处理

建议对于包括中小型号报表和数据集的应用程序使用本地处理模式。由于所有数据和报表的处理都是在客户端进行的,因此,如果您试图处理大型或复杂的报表和查询,性能可能会降低。如果您需要简单的部署策略,其中应用程序的所有部分都在同一台计算机上一起运行,也建议使用本地处理模式。本地处理模式的功能不及远程处理强大,它适用于不需要报表服务器的独立应用程序。熟悉在远程 SQL Server Reporting Services 报表服务器上运行的服务器报表的用户应注意以下特别之处:

  • 客户端报表定义 (.rdlc) 中的报表参数不映射到查询参数。客户端报表定义中没有参数输入区域,它接受随后在查询中使用的值。
  • 客户端报表定义不包含嵌入式查询信息。您必须定义返回可供报表使用的数据的数据源。
  • 通过 RSClientPrint ActiveX 控件执行的基于浏览器的打印不适用于 ReportViewer Web 服务器控件中运行的客户端报表定义。打印控件是报表服务器功能集的一部分。

——将 ReportViewer 配置为进行本地处理

    回到本随笔开头的问题,上面红色黑体的部分已经说明白了,Web窗体中的ReportViewer控件使用LocalReport是不能使用打印按钮进行打印的。

   在没有看到上面引用的两段来自MSDN的描述时,我还进行了一些尝试,结果当然是不成功的,但是还是记录下来这个过程:

   为了对比在Web项目中使用LocalReport和ServerReport的不同,我在Web项目中新建了两个页面wfLocalReport.aspx和wfServerReport.aspx,在这两个页面上分别放置一个ReportViewer控件,并在“ReportViewer 任务”中分别指定一个客户端报表和一个服务器端报表。我们已经知道,无论在设计时还是在运行时,前者是没有打印按钮的,而后者是有的。前者的打印按钮是不是隐藏了?如果是,可以通过某种方法把它显示出来吗?

   对比一下ReportViewer控件的属性,发现除了LocalReport和ServerReport两个属性设置不同之外并无其它不同之处,而且两者的ShowPrintButton属性均已默认设置为True。

   运行这两个页面,在浏览器中右键“查看源文件”,这时候我们会发现,返回到客户端的HTML确实是不同的,前者根本就没有表示打印按钮的HTML代码出现,而后者就有——

代码1:wfServerReport.aspx向客户端发送的HTML文件中的“打印”按钮

   在上面的代码中,LoadPrintControl()方法从何而来呢?使用路径http://localhost:2167/LRPrintInWA/Reserved.ReportViewerWebControl.axd?OpType=Resource&Version=8.0.50727.42&Name=Scripts.ReportViewer.js可以得到一个名为Scripts.ReportViewer.js的.js文件,LoadPrintControl()方法就定义在该文件中——

代码2:LoadPrintControl方法

   另外,我们在该.js文件中还可以发现一个名为RSToolbar的函数——

代码3:RSToolbar构造函数

   这显然是ReportViewer的工具栏的构造函数,而我们对比wfLocalReport.aspx和wfServerReport.aspx两个页面返回的HTML文件,可以发现,它们的构造是不同的——

代码4:wfLocalReport.aspx向客户端发送的HTML文件中ReportViewer控件的工具栏的构造

代码5:wfServerReport.aspx向客户端发送的HTML文件中ReportViewer控件的工具栏的构造

   仔细对比代码4和代码5,可以发现代码4中倒数第四个参数为空字符串,那么,我们有理由怀疑代码5中的倒数第四个参数,运行Web项目进入页面wfServerReport.aspx,查看源文件,取出这个参数的字符串值将其附加到地址栏中(类似这样的一个URL:http://localhost:2167/LRPrintInWA/Reserved.ReportViewerWebControl.axd?ReportSession=5z3m52ucuk4avi55xh0yx0jr&ControlID=6bea4929-cf7e-4ed6-bb88-360e33f26d41&Culture=2052&UICulture=2052&ReportStack=1&OpType=PrintHtml),回车,哈哈,我们看到了什么?


图2 通过一个URL调出的打印窗口(点击小图看大图)

   对照LoadPrintControl方法来看,之所以页面中会生成iframe,是为了保持页面的状态,而只需更改该iframe的location就可以调出该打印窗口。同样的,报表的其它操作也是通过这种方法来实现的。

   那么,我们就此是否就可以有很多想法了?比如,在wfLocalReport.aspx中自己手动增加一个按钮也按照上面的方法进行报表的打印?

   这就不好说了,说不定一不留神,这个问题解决了,呵呵,那样的话,基本上就可以用RDLC代替Reporting Services了,我们似乎也就不用买SSRS的license了,嘿嘿,妄想中……

   现在,我们需要分析一下这个URL——http://localhost:2167/LRPrintInWA/Reserved.ReportViewerWebControl.axd?ReportSession=5z3m52ucuk4avi55xh0yx0jr&ControlID=6bea4929-cf7e-4ed6-bb88-360e33f26d41&Culture=2052&UICulture=2052&ReportStack=1&OpType=PrintHtml。

   Reserved.ReportViewerWebControl.axd是什么?恩,这是个问题,并不存在这个物理文件,MSDN上也没有说明,但是在Web.Config中我们可以看到以下代码——

代码6:Web.Config中的Reserved.ReportViewerWebControl.axd

   也就是说,其实我们并不需要关心Reserved.ReportViewerWebControl.axd是什么,遇到客户端请求这个文件,没关系,ASP .NET引擎会搞定它。

   接下来看上述URL的参数。如果我们能够知道各个参数的来源以及在程序中取得参数值的方法,那么我们也可以使用类似上面的一个URL来进行报表的打印了。恩,我们的目标是知道在使用RDLC报表的情境下这些参数的值,但是在此之前,我们需要在ServerReport情境下找到这些参数的来源,然后对应看在RDLC报表情境下是否可以取得这些参数的值,如果对应的结果是肯定的,那么,我们也就可以实现客户端报表的打印了。

   首先,参数Culture、UICulture、ReportStack和OpType的取值应该是确定的,虽然可能并不是非常清楚这些参数的含义,但不妨猜测一下:Culture和UICulture不用说了吧,从其取值2052(简体中文)就可以知道大差不离了;ReportStack,估计是和堆栈是有关的,看其取值,估计1应该是一种方式或属性等的代码;而OpType应该是操作类型,取值PrintHTML就是我们要做的事情嘛。

   而对于参数ControlID来说,是ReportViewer控件的标识符,好像Microsoft并没有公开获取该值的方法(也许是我没找到。:)),不过ReportViewer控件的非公有成员m_instanceIdentifier的取值就是这个ControlID(如图3所示)。


图3 ReportViewer控件的非公有成员m_instanceIdentifier

   不过,这个ControlID我们是不用发愁的,我们在Web窗体发送到客户端的HTML文件中是可以找到的,缩放等报表操作已经提供了这个值,取过来就OK了。

   最后就剩一个ReportSession了,ReportSession是什么呢?怎样得到ReportSession的值呢?使用和参数ControlID一样的方法从客户端HTML文件中取?

   事实上,参数ControlID在wbLocalReport.aspx和wbServerReport.aspx这两个Web窗体发送到客户端的HTML文件中都出现了多次,参数ReportSession在wbServerReport.aspx发送到客户端的HTML文件中也出现了多次,而在wbLocalReport.aspx发送到客户端的HTML文件中并没有出现。

   既然参数的名称是ReportSession,那么会不会和Session有关呢?在页面中监视一下this.Session,发现this.Session[0]是一个Microsoft.Reporting.WebForms.ReportInfo结构,也可以在改结构中发现一个非公有成员m_executionID(如图4所示),其值和参数ReportSession的取值相同。


图4 ReportViewer控件的非公有成员m_executionID

   而且,Microsoft也实现了一个方法用于获取该值:this.ReportViewer1.ServerReport.GetExecutionId()。

   上面描述的两个参数是ServerReport才具备的特征,那么LocalReport呢?参数ControlID是OK的,而参数ReportSession在LocalReport中是无法取到的,这是非常遗憾的地方。而上述URL的ReportSession参数是无法省略或随便赋值的(会出现“ASP.NET 会话已过期”错误),这也就是说,我们的努力已经宣告落空了…………

   本来和一个朋友说昨天晚上就发这篇随笔的,到现在才发出来,抱歉!另外,这篇随笔其实并没有意义,只是对在Web项目中使用RDLC报表时如何打印的尝试,而且是一个失败的尝试。希望后来的朋友不再使用RDLC在Web项目中做报表,除非不需要使用打印功能,在这个意义上,本随笔可以算作是对这个结论的一个证明。

   
 

Life is like a boat, and I'm at sea.

posted @ 2006-09-13 00:39 蜡人张 阅读(11708) 评论(81)  编辑 收藏 网摘 所属分类: Web开发Reporting

  回复  引用  查看    
#1楼2006-09-13 08:02 | aspnetx      
关注
刚刚接触

  回复  引用  查看    
#2楼2006-09-13 08:40 | 牧野      
呵呵,早看到就好了,谢谢分享经验,我们都是导出文档到本地再打印的.
  回复  引用  查看    
#3楼2006-09-13 09:00 | 浪子      
问题严重了:(
  回复  引用    
#4楼2006-09-13 14:48 | baiy[未注册用户]
推荐看看 web打印的完美解决方案http://qq6441.meibu.com

我的csdn博客有很多相关的打印文章 http://blog.csdn.net/qmei

  回复  引用    
#5楼2006-09-14 02:45 | cnyouyou[未注册用户]
其实LocalReport可以显示成PDF版本后,这时就可以打印了
  回复  引用    
#6楼2006-09-14 08:26 | daisylh[未注册用户]
我還準備嘗試哩,原來這麽不好用啊
  回复  引用  查看    
#7楼[楼主]2006-09-14 23:38 | 蜡人张      
@cnyouyou
呵呵,我说的是不能用“打印”按钮直接打印

@daisylh
可以使用服务器端报表

  回复  引用    
#8楼2006-09-20 11:37 | Night_Cat[未注册用户]
還是老大厲害呀﹐我就慘了點﹐曾經這樣試過N次﹐嗨
  回复  引用  查看    
#9楼[楼主]2006-09-20 22:05 | 蜡人张      
@Night_Cat
呵呵,这得怪微软了……:)

  回复  引用  查看    
#10楼2006-09-27 14:21 | Carlwave-陆飞(Fei.Lu)      
呵呵,关于打印比我研究的深刻多了,佩服一下~~我看到微软说本地打印的插件不提供就放弃了~~以后还要更深入阿。
你有没有使用过reportviewer导出PDF?我发现导出的中文都显示为?号,查了很久,只有查到说PDF官方提供的插件导出中文很不理想,至今没有找到解决方案。你有遇到过么?

  回复  引用  查看    
#11楼[楼主]2006-09-28 21:38 | 蜡人张      
@Carlwave-陆飞(Fei.Lu)
呵呵,我还真没试过到处到PDF文件的情况,刚才试了一下,没问题的,中文可以显示。昨天晚上就看到你的回复了,但是当时在赶着写一个材料,现在才回复,抱歉!不知道你的RDL文件中是否有“<Language>zh-CN</Language>”。

  回复  引用  查看    
#12楼2006-09-29 09:42 | Carlwave-陆飞(Fei.Lu)      
@蜡人张
这太奇怪了,我原本查到的资料说PDF官方的程序支持中文很差,还以为大家导出的PDF中文都不支持。
<Language>zh-CN</Language>这个条件记得曾经在哪里看到说是一个BUG,不管怎么设置语言都不产生影响,我在本机这里试过确实怎么改都没效果。你用的是VS2005中文版么?我现在开始怀疑我用的是英文版的缘故了,难道英文版对PDF的驱动和中文版的驱动不同?

Thanks for attention.

  回复  引用  查看    
#13楼[楼主]2006-09-29 22:17 | 蜡人张      
@Carlwave-陆飞(Fei.Lu)
我的VS2005和SQL Server 2005都是中文版的,有可能是英文版的原因,毕竟是SQL Server 2005不依赖任何其它程序直接导出为PDF文件的。

  回复  引用    
#14楼2006-10-01 11:01 | 大[未注册用户]
我用rdlc做的报表打印很成功哦...就是有点烦人.
  回复  引用    
#16楼2006-11-24 21:08 | Carlwave
@sidney
我下载过的,还是不行阿,原本pdf用的就是中文版的,我估计原因不在PDF上面,应该是SQL2005用的英文版,导出的不支持中文字体。猜想……谢谢拉。

  回复  引用    
#17楼2006-11-30 12:44 | 光影传说[匿名][未注册用户]
刚读您的文章的时侯,我真的是不准备做Web直接打印了.后来客户用CS方式习惯了,导出再打印,太不方便了.
还好,Web本地RDLC报表的问题,昨天晚上终于解决了.
现在我也可以松一口气了,但是还没有整理出来,整理出来的时候,再传上来.
MSN:dreamstec@hotmail.com

  回复  引用  查看    
#18楼[楼主]2006-11-30 15:18 | 蜡人张      
@光影传说[匿名]
期待你的文章,到时候不要忘了贴下URL,谢了!
不过,我想应该是变通的方法吧?

  回复  引用    
#19楼2006-11-30 22:09 | 光影传说[匿名][未注册用户]
public class WSViewer : Microsoft.Reporting.WebForms.ReportViewer
{
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
StringBuilder sb = new StringBuilder();
sb.Append("<script language=\"javascript\" type=\"text/javascript\">");
sb.Append(@"function " + this.ClientID + @"printframe()
{
var pframe=ReportFrame" + this.ClientID + @".frames['report'];
if(pframe==null)
alert('请重试');
else
{
pframe.focus();
pframe.print();
}
}
");
sb.Append("var refresh=document.getElementById('" + this.ClientID + "_ctl01_ctl06_ctl00');");
sb.Append("var td=document.createElement('td');");
sb.Append("var bt=document.createElement('button');");
sb.Append("bt.setAttribute('id','"+this.ClientID+"_PrintBTID');");
sb.Append("bt.setAttribute('value','打印');");
sb.Append("td.appendChild(bt);");
sb.Append("refresh.firstChild.firstChild.appendChild(td);");
sb.Append("bt.attachEvent('onclick'," + this.ClientID + "printframe);");
sb.Append("</script>");
writer.Write(sb.ToString());
}
}

  回复  引用  查看    
#20楼2006-11-30 22:42 | 光影传说      
 
这个就是图片

  回复  引用  查看    
#21楼2006-12-01 00:09 | 光影传说      
晚上部署在服务器上了,工作正常。
  回复  引用  查看    
#22楼2006-12-01 09:01 | 光影传说      


    public class WSViewer : Microsoft.Reporting.WebForms.ReportViewer
    
{
       
protected override void Render(HtmlTextWriter writer)
        



 

昨天发错了,发的是我用于测试的Demo的主要代码了。不好意思,重发一下。

 



  回复  引用    
#23楼2006-12-01 11:35 | 含羞草[未注册用户]
@Carlwave-陆飞(Fei.Lu)
在报表定义文件中把显示中文的单元格的字体设置为中文字体,导出pdf中的中文就不是乱码了,呵呵

  回复  引用  查看    
#24楼[楼主]2006-12-01 14:14 | 蜡人张      
@光影传说
不错的方法,谢谢!这种思路我以前也见过,我还没有试,对多页报表如何处理呢?

  回复  引用  查看    
#25楼2006-12-01 20:53 | 光影传说      
多页报表的处理,还是原来的自带的引擎处理,不过这个问题,我还没有考虑。

  回复  引用  查看    
#26楼2006-12-02 21:42 | 光影传说      
张老师,刚刚大致试了一下,还有很多问题,看来多页打印,是有问题。空下来的时候,再试一试,不知道张老师有什么好的想法,请指教一下,做这一块,我也是刚刚才接触到的,原来主要是做中间服务层。
  回复  引用    
#27楼2006-12-03 22:52 | Carlwave
@含羞草
兄弟,太感谢了,问题解决。汗~~差点死在一个字体上。:)

  回复  引用    
#28楼2006-12-05 09:40 | 含羞草[未注册用户]
@Carlwave
不用客气,这个问题当时也困扰了偶很久:)

  回复  引用  查看    
#29楼2007-01-10 16:22 | Daniel Phang      
本地模式的打印现在可解决了?
  回复  引用    
#30楼2007-01-11 16:35 | R.E[未注册用户]
有个比较头疼的问题:
web程序,ReportViewer控件,引用服务器报表
问题就是:显示出的报表工具栏都是英文的,比如查找,导出。。。
目前有这么几种组合,只有一种是能显示中文的:
中文win2003,英文sql2005,中文vs2005
其他的:
英文win2003,英文sql,英文vs2005;
中文win2003,英文sql,英文vs2005/不装;
这两种是显示英文的,我怀疑是英文的.net framework造成的,但是我装了中文语言包,没有效果;
有没有人有建议阿!!!!!

  回复  引用    
#31楼2007-03-03 01:00 | sunny[未注册用户]
这种打印尝试很有意义,thank you!
  回复  引用    
#32楼2007-07-28 17:42 | dekit[未注册用户]
可否直接在服务器上生成PDF文件然后通过
PDF的ActiveX控件预览报表,或用JS控制那个ActiveX直接打印。

  回复  引用    
#33楼2007-08-11 17:05 | luck2050[未注册用户]
vs2008中asp.net中的本地rdlc报表已经可以直接打印了
  回复  引用    
#34楼2007-08-12 22:33 | yyding[未注册用户]
我在windows项目中用rdlc报表导出PDF后,直接报错,都导不出来啊,

对 PInvoke 函数“Microsoft.ReportViewer.Common!Microsoft.ReportingServices.Rendering.ImageRenderer.CompositionPDF+WindowsGDIWrapper::GetGlyphIndicesW”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
请问大家有没有遇到这种情况阿?谢谢

  回复  引用    
#35楼2007-08-29 10:28 | joinler[未注册用户]
我的为什么导不出来呢 保存时无法下载

  回复  引用    
#36楼2007-08-29 10:29 | joinler[未注册用户]
excl pdf 都导不出

  回复  引用    
#37楼2007-10-25 12:46 | ouyang[未注册用户]
我程序点击打印按钮打印出来后发现打印出来的页数是控件里面显示页数的两倍,其中所有偶数页面都是空白的。张老师能帮我解决下吗?是什么原因引起的
  回复  引用    
#38楼2007-11-27 20:23 | telos lee[未注册用户]
我做了兩個報表A,B,其中B是A的子表,單擊A中某一列的數據,會JUMP到B表(附加參數),B的某一列顯示圖片.
在web中運行時,當我從A中JUMP到B時,B的圖片不能顯示.在當前B表頁面刷新,會回到A表.再次JUMP到B表,這時圖片能夠顯示,一切正常了.
這個問題有些機子會出現,有些不會出現.奇怪的是,在運行正常的機子上,B表頁面只會有一個地址,在出現問題的機子上會有兩個.
請教一下原因.
謝謝.
附:
A表頁面地址:
Reserved.ReportViewerWebControl.axd?ReportSession=mymkwp3aug0a4s45vtcqsi55&ControlID=d6fe29441fd44245ad312abe1193c626&Culture=1028&UICulture=1028&ReportStack=1&OpType=ReportArea&Controller=ClientControllerMP_mainHolder_Repor&PageNumber=1&ZoomMode=Percent&ZoomPct=100&ReloadDocMap=true&SearchStartPage=0&LinkTarget=_top
B表頁面第一次地址:
Reserved.ReportViewerWebControl.axd?ReportSession=rtaerhjmdzzw3m45taajns55&ControlID=d6fe29441fd44245ad312abe1193c626&Culture=1028&UICulture=1028&ReportStack=2&OpType=ReportArea&Controller=ClientControllerMP_mainHolder_Repor&PageNumber=1&ZoomMode=Percent&ZoomPct=100&ReloadDocMap=true&SearchStartPage=0&LinkTarget=_top
B表頁面的二次地址:
Reserved.ReportViewerWebControl.axd?ReportSession=ofwiau4513spwq550hsgo1qa&ControlID=d6fe29441fd44245ad312abe1193c626&Culture=1028&UICulture=1028&ReportStack=3&OpType=ReportArea&Controller=ClientControllerMP_mainHolder_Repor&PageNumber=1&ZoomMode=Percent&ZoomPct=100&ReloadDocMap=true&SearchStartPage=0&LinkTarget=_top

  回复  引用    
#39楼2008-01-12 21:20 | yhhhso[未注册用户]
请问RDLC能生成WORD文件吗?如果能生成Word 就更加好了,如果要生成word 文件的报表有什么好的方法没?谢谢您!有现成的DEMO mail to me yhhhso@163.com
  回复  引用    
#40楼2008-02-25 12:36 | 路人abcdefg[未注册用户]
不知道下面这个方案是否有效:
1)自己在web页上放一个打印按钮;点击打印按钮后,在后台导出文件存在服务器上;
2)在服务器上放一个单独的Windows程序(或者做成Windows服务),每隔2秒检测一下有无新增文件,如有则将其打印出来。

这样子,报表实际上是在服务器上打印的,因此需要在服务器端做好相应的打印机设置,客户端就看不到“打印...”对话框了,也不能变更打印机(只能事先在服务器端指定)。

  回复  引用  查看    
#41楼[楼主]2008-02-25 21:21 | 蜡人张      
@路人abcdefg
你说的当然是没问题的,呵呵,但是在服务器上打印的意义其实并不大,难道需要每次到服务器处取打印好的文档吗?

在2008中这个问题已经解决了,可以直接在浏览器端使用打印按钮打印报表。

  回复  引用    
#42楼2008-03-13 17:16 | 张明明[未注册用户]
“@光影传说”的办法 是目前解决WEB打印较为平衡的一个方法,基本能实施打印要求,代码也简单,而且不用增加产品成本,额外买第三方控件。
对于多页不能打印的问题,有个折中办法:浏览第一页时点打印按钮,打第一页,类推,有多少页就点多少次打印。:)期待更好的办法。

  回复  引用    
#43楼2008-03-24 11:23 | spider80529[未注册用户]
张老师,我想请教一个 关于winform的打印问题
如何才能在 winform 中动态切换报表的显示呢?
if (dt.Rows.Count >0)
{
newViewer.LocalReport.ReportPath = "";
newViewer.LocalReport.ReportEmbeddedResource = "WindowsApplication1.Report1.rdlc";
//newViewer.LocalReport.LoadReportDefinition();
}
else
{
newViewer.LocalReport.ReportPath = "";
newViewer.LocalReport.ReportEmbeddedResource = "WindowsApplication1.Report2.rdlc";
}
ReportDataSource rpt = new ReportDataSource("test_testing", dt);

newViewer.LocalReport.DataSources.Add(rpt);

newViewer.LocalReport.Refresh();
我用上面的方法动态加载报表,可是,报表界面始终提示我,“尚未指定报表的来源”
希望您指教,谢谢!

  回复  引用    
#44楼2008-03-24 18:49 | spider80529[未注册用户]
张老师,上面的问题解决了,不过又产生了新的问题
我的代码如下:
private void button1_Click(object sender, EventArgs e)
{
reportViewer1.LocalReport.DataSources.Clear();
reportViewer1.Reset();
if (dt.Rows.Count >0)
{
this.reportViewer1.LocalReport.ReportEmbeddedResource = "WindowsApplication1.Report2.rdlc";
}
else
{
this.reportViewer1.LocalReport.ReportEmbeddedResource = "WindowsApplication1.Report2.rdlc";
}
ReportDataSource rpt = new ReportDataSource("test_testing", dt);

reportViewer1.LocalReport.DataSources.Add(rpt);

reportViewer1.LocalReport.Refresh();
}
其实我的目的就是想通过记录条数来加载不同的报表,已进行不同的显示,但是现在加载了报表后,预览框里什么都没有显示,希望您能给我指点一下,谢谢
我的qq:308274866

  回复  引用  查看    
#45楼[楼主]2008-03-24 19:44 | 蜡人张      
@spider80529
既然.rdlc文件被设置为“嵌入的资源”,那么就不能使用ReportPath属性来设置报表路径,应该使用ReportEmbeddedResource进行设置,这是第一次出现问题的原因;第二次的问题没看明白,“预览框里什么都没有显示”是什么意思?是只在预览看不见数据吗?代码中请确认报表设计时数据源名称为“test_testing”。

  回复  引用    
#46楼2008-03-25 10:42 | spider80529[未注册用户]
是的,张老师,在预览框里看不到数据,而且也没有显示出报表设计好的格式
  回复  引用  查看    
#47楼[楼主]2008-03-25 20:20 | 蜡人张      
  回复  引用    
#48楼2008-03-26 10:16 | spider80529[未注册用户]
谢谢张老师,我再看看
  回复  引用    
#49楼2008-03-27 18:34 | spider80529[未注册用户]
张老师,还得请教您一个问题,在 reportviewer 的list中 ,是否可以嵌入 table控件?
如果不能嵌入,那么我要如何在我的每一页报表中都显示 一个相同的table表呢?
请你赐教,谢谢!

  回复  引用  查看    
#50楼[楼主]2008-03-27 20:01 | 蜡人张      
@spider80529
List和Table类似,用于显示记录集中的多条数据,所以不能在List中嵌入Table,矩形是可以的,不过你的需求还应该考虑到如何进行分页。

  回复  引用    
#51楼2008-03-27 20:41 | spider80529[未注册用户]
分页我也不太清楚,我用子报表加入table解决了,可是我想问,如何控制子报表的行数呢,例如:我的数据不够十行,但是我想让table最少显示十行,怎样操作呀?
  回复  引用  查看    
#52楼[楼主]2008-03-27 21:42 | 蜡人张      
@spider80529
子报表的真正作用并不是这个,它应该用来呈现主子表中的子表;至于数据不够十行的问题,可以通过构造特殊数据集的方式来解决,数据集中有空行,有几个空行完全可以由程序来确定,这样报表上就不会显示内容。报表设计不能解决的问题可以换个思维,可以在绑定的数据集上动动手脚,你的上一个问题也可以通过构造数据集来解决,仔细想一想,呵呵……

  回复  引用  查看    
#53楼[楼主]2008-03-27 21:46 | 蜡人张      
@spider80529
子报表的真正作用并不是这个,它应该用来呈现主子表中的子表;至于数据不够十行的问题,可以通过构造特殊数据集的方式来解决,数据集中有空行,有几个空行完全可以由程序来确定,这样报表上就不会显示内容。报表设计不能解决的问题可以换个思维,可以在绑定的数据集上动动手脚,你的上一个问题也可以通过构造数据集来解决,仔细想一想,呵呵……

  回复  引用    
#54楼2008-03-28 18:18 | spider80529[未注册用户]
谢谢张老师的指点,我虽然也知道子表是用来显示数据 主子表中子表数据的,但是我实在想不出什么好的方法去解决那个table的问题。
还有您说到可以控制数据集,这个我没有考虑到,谢谢您的提醒,谢谢!

  回复  引用    
#55楼2008-04-17 14:14 | 王俊丽[未注册用户]
关于客户端报表打印的功能还是没有弄明白
继承 Microsoft.Reporting.WebForms.ReportViewer
不行

  回复  引用    
#56楼2008-04-28 16:56 | jdragon[未注册用户]
最新的Microsoft.ReportViewer.WEbForms.dll,版本9.0.0.0,已经可以支持local的rdlc文件打印了,在打印的时候,IE会下载一个签名了的RSClientPrint.Cab文件,大概1.1M,然后会直接打印到IE端的打印机上。
  回复  引用    
#57楼2008-06-16 15:45 | 匿名吧[未注册用户]
可以直接打印的,一个高手远程协助调试出来了,但是是别人的成果,他一直以来不说我也不好放代码出来,很简单的几句代码而已,哎,bs自己
  回复  引用    
#58楼2008-07-03 00:14 | 楼申中[未注册用户]
最新的Microsoft.ReportViewer.WEbForms.dll,版本9.0.0.0怎样安装到VS2005中
  回复  引用    
#59楼2008-07-09 11:51 | m[未注册用户]
to #57楼
兄弟,别BS自己了,把代码或相关内容发出来分享一下吧(我想那位高手不会介意的,版权注明是那位高手前辈就好) ^_^

  回复  引用  查看    
#60楼2008-07-22 16:19 | hbf      
好文章,收藏了
  回复  引用  查看    
#61楼[楼主]2008-07-23 01:31 | 蜡人张      
@hbf
呵呵,您搁我这灌水来了,不过,欢迎来灌!

  回复  引用  查看    
#62楼2008-07-23 09:30 | hbf      
@蜡人张
蜡人张兄,最近在看你的帖子,看完后收获甚大。
但谨记:看帖不留言不厚道,呵呵……估计以后还要天天来“灌”

  回复  引用  查看    
#63楼2008-07-31 16:34 | Michael Xu      
好文章 收藏!!
  回复  引用    
#64楼2008-08-15 09:31 | meteor85[未注册用户]
我也遇到这个问题了,如何打印呀?或者谁能告诉我如何导出!
  回复  引用    
#65楼2008-08-15 16:41 | 反对党[未注册用户]
我是vs 2008的怎么不行哟?用RDLC客户端浏览器还是没有打印按钮
  回复  引用  查看    
#66楼[楼主]2008-08-18 00:24 | 蜡人张      
@反对党
VS2008设计的RDLC报表是有打印按钮的

  回复  引用  查看    
#67楼[楼主]2008-08-18 00:25 | 蜡人张      
@meteor85
需要选择导出类型为PDF或XLS,然后单击工具栏导出按钮

  回复  引用    
#68楼2008-08-19 14:15 | 反对党[未注册用户]
VS 2008 用RDLC客户端有打印按钮了,原来我默认是火狐的浏览器就发现不了.IE的就可以了,不过要加装一个插件哟.
  回复  引用    
#69楼2008-08-19 14:36 | 反对党[未注册用户]
还有一个问题请教下子:如何实现WEB RDLC报表的的纸张大小,左右边距,横打,纵打,以及每页设置打印多少行的方法呀.我希望能够把参数保存下来,下次能用,而不是每次都在修改参数. 蜡兄弟.请教了哟!
  回复  引用    
#70楼2008-08-20 11:26 | 雨季不再来[未注册用户]
请教张老师,我现在用的Vs2005,这个RDLC的Web打印把我搞得焦头烂额,哎。2008年了,现在有什么好的解决办法呢,如果把项目从VS2005升到2008,是否会存在大的问题呢?
  回复  引用  查看    
#71楼[楼主]2008-08-20 23:50 | 蜡人张      
@反对党
@反对党
这个在Web环境中很难全部进行有效的控制,WinForm环境中可以直接控制打印机(硬件),所以只能在报表设计时想办法。VS2008中设计的报表的打印没有仔细看过,不是很清楚,但是既然是需要下载并安装一个插件,还是有可能进行打印机控制的。

  回复  引用  查看    
#72楼[楼主]2008-08-20 23:52 | 蜡人张      
@雨季不再来
是否可以把项目从VS2005升级到VS2008取决于你使用了.Net Framework 2.0中的哪些类库,这些类库在.Net Framework 3.5中是否发生了非常的地变化。不管怎样,你可以尝试一下,比较好的情况是不需要进行任何变更。

  回复  引用    
#73楼2008-08-28 14:23 | tjli[未注册用户]
唉:web的打印真是不好弄,兄弟们又解决方案,希望共享一下
  回复  引用    
#74楼2008-11-03 22:59 | hougoo[未注册用户]
Microsoft.ReportViewer.WebForms 9.0 vs 2008 带的版本
已经可以打印本地 报表了
但是 效果非常的不好,显示的和打印的效果不一样
部分设置打印的效果莫名其妙的会变格式

效果最好的就是导出PDF和excel

  回复  引用    
#75楼2008-11-12 17:20 | khkly[未注册用户]
在vs2005中的ReportViewer(RDLC报表)中使用直接打印功能,在vs2005使用ReportViewer2008

http://hi.baidu.com/sl198012/blog/item/0393e913f82005045baf53cb.html

  回复  引用    
#76楼2009-01-19 20:01 | heaven8585[未注册用户]
请教一个问题, 我差着了相当多资料,觉得这篇比较接近。但是还是需要您来帮我解答一下。
我想在 Reporting services 中 RDL报表中, 用一个jump to url 来调用打印。 比如说 我的报表里做了个一个地方能够直接打印,因为有些用户 注意不到自带的那个小图标,回习惯的用IE提供的打印,所以我想尝试直接在报表里调用打印。我觉得应该可以的,只是不知道怎么做?

  回复  引用    
#77楼2009-01-19 20:38 | heaven8585[未注册用户]
请教一个问题, 我查找了相当多资料,觉得这篇比较接近。但是还是需要您来帮我解答一下。
我想在 Reporting services 中 RDL报表中, 用一个jump to url 来调用打印。 比如说 我的报表里做了个一个地方能够直接打印,因为有些用户 注意不到自带的那个小图标,回习惯的用IE提供的打印,所以我想尝试直接在报表里调用打印。我觉得应该可以的,只是不知道怎么做?
我查看了报表页面的源代码 , 找不到“页面返回的HTML文件”
能告诉怎么 找到那个链接么?
感激不尽啊!




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 502630




相关文章:

相关链接: