2012-05-24 71 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%>)