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ライブラリを追加した場合に備えて、それはそれであると思いましたが、何もしていません。ところで、別のスタックオーバーフローの質問に対する回答の1つであるため、ここからそのjavascriptを取得しました。

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";

そしてそれはそれでした.Googleの内部を掘り続けなければならなかったと思います..lol

于 2012-05-25T21:13:35.620 に答える
0

$find("rvReports")エラーから、コントロールのないコレクションを返すように見え、結果として get_reportAreaContentType がエラーを報告します。スクリプト デバッガーで$find("rvReports")呼び出しの結果を確認し、期待する要素がビューに存在するかどうかを確認します。

セレクターは「#rvReports」にする必要があることに注意してください...

于 2012-05-24T22:32:02.160 に答える
0

$find 関数で serverId ではなく clientId を使用します。

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