2012-05-24 74 views
0

好吧我已经花了几个小时(确切地说是4)寻找解决方案。我发现了一些结果,但目前为止还没有结果。 :(打印ReportViewer从自定义按钮而不是工具栏

问题:我在usercontrol中有一个reportviewer,我隐藏了工具栏并创建了自己的。现在我添加了一个应该打印的按钮,但似乎无法使其工作。带你都可以对我有什么解决方案,但它必须是一个按钮,没有自带报表的默认酒吧

这里是我的代码:。

<rsweb:reportviewer 
ID="rvReports" 
runat="server" 
Height="600px" 
Width="600px" 
ShowToolBar="False" 
SizeToReportContent="True" AsyncRendering="false" /> 

<asp:ImageButton ID="btnprint" runat="server" ImageUrl="../img/print.png" 
    OnClientClick="PrintReport();" /> 

的Javascript:

<script type="text/javascript"> 
function PrintReport() { 
    var viewerReference = $find("rvReports"); 
    var reportArea = viewerReference.get_reportAreaContentType(); 
     if (reportArea == Microsoft.Reporting.WebFormsClient.ReportAreaContent.ReportPage) { 
      $find("rvReports").invokePrintDialog(); 
     } 

} 
</script> 

的错误我这个得到的是:

Uncaught TypeError: Cannot call method 'get_reportAreaContentType' of null 

以防万一,我加了一个jQuery库,因为我认为这是它,但没有做.. BTW我得到了javascript中here,因为它是在另一个答案之一stackoverflow问题。

+0

你的标题说“来自代码隐藏”(服务器端C#代码),但示例只有JavaScript客户端代码。哪一个是正确的(如果需要,请更新问题/标题)。 –

+0

你去了,对不起。 – Andres

回答

0

从看起来像$find("rvReports")的错误返回没有控件的集合,结果get_reportAreaContentType报告错误。检查脚本调试程序$find("rvReports")调用的结果,看看您期望的元素是否存在于视图中。

注意我认为选择应该是“#rvReports” ......

0

最后我用iTextSharp的这一点,这是很简单的。添加一个隐藏的iframe和代码隐藏在此:

Warning[] warnings; 
     string[] streamids; 
     string mimeType; 
     string encoding; 
     string extension; 

     byte[] bytes = rvReports.LocalReport.Render("PDF", null, out mimeType, 
         out encoding, out extension, out streamids, out warnings); 

     FileStream fs = new FileStream(HttpContext.Current.Server.MapPath("output.pdf"), FileMode.Create); 
     fs.Write(bytes, 0, bytes.Length); 
     fs.Close(); 

     //Open exsisting pdf 
     Document document = new Document(PageSize.LETTER_LANDSCAPE, 0, 0, 0, 0); 
     PdfReader reader = new PdfReader(HttpContext.Current.Server.MapPath("output.pdf")); 
     //Getting a instance of new pdf wrtiter 
     PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(
      HttpContext.Current.Server.MapPath("Print.pdf"), FileMode.Create)); 
     document.Open(); 
     PdfContentByte cb = writer.DirectContent; 

     int i = 0; 
     int p = 0; 
     int n = reader.NumberOfPages; 
     Rectangle psize = reader.GetPageSize(1); 

     //float width = psize.Width; 
     //float height = psize.Height; 

     //Add Page to new document 
     while (i < n) 
     { 
      document.NewPage(); 
      p++; 
      i++; 

      PdfImportedPage page1 = writer.GetImportedPage(reader, i); 
      cb.AddTemplate(page1, 0, 0); 
     } 

     //Attach javascript to the document 
     PdfAction jAction = PdfAction.JavaScript("this.print(true);\r", writer); 
     writer.AddJavaScript(jAction); 
     document.Close(); 

     //Attach pdf to the iframe 
     frmPrint.Attributes["src"] = "Print.pdf"; 

,并且做到了,你猜只是必须保持google..lol

0

使用的clientId内挖在$查找功能不SERVERID:

$find(<%=rvReports.ClientID%>)