0

好的,我花了几个小时(确切地说是 4 小时)寻找解决方案。我找到了几个结果,但到目前为止都没有。:(

问题:我在用户控件中有一个报告查看器,我隐藏了工具栏并创建了自己的工具栏。现在我添加了一个应该打印的按钮,但似乎无法让它工作。我会为大家提供任何解决方案。但它必须是一个按钮,而不是报告附带的默认栏。

这是我的代码:

<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 库,因为我认为就是这样,但什么也没做。顺便说一句,我从这里得到了那个 javascript,因为它是另一个 stackoverflow 问题的答案之一。

4

3 回答 3

1

我最终为此使用了 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";

就这样,猜猜只需要继续在谷歌内部挖掘..lol

于 2012-05-25T21:13:35.620 回答
0

在 $find 函数中使用 clientId 而不是 serverId:

$find(<%=rvReports.ClientID%>)
于 2013-01-21T15:46:22.163 回答
0

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

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

于 2012-05-24T22:32:02.160 回答