从自定义按钮而不是工具栏打印报表查看器
print ReportViewer from custom button not toolbar
好的,我花了几个小时(确切地说是 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,因为它是另一个堆栈溢出问题的答案之一。
我最终为此使用了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";
就这样,猜测只需要继续挖掘谷歌内部。哈哈
从错误来看,它看起来像$find("rvReports")
返回没有控件的集合,结果get_reportAreaContentType报告错误。在脚本调试器中检查$find("rvReports")
调用的结果,并查看视图中是否存在所需的元素。
注意我认为选择器应该是"#rvReports"...
在$find函数中使用clientId而不是serverId:
$find(<%=rvReports.ClientID%>)
相关文章:
- 使用javascript将动态表从一个html页面打印到另一个html页
- JavaScript打印功能使日历停止工作
- esri javascript异步打印
- 文本框不是从Javascript/Asp.net中的对话框中打印出来的
- jQuery/JavaScript在线公文包表单-打印样式表
- 如何打印嵌套对象的所有值
- 在终端中运行 JavaScript 时(使用 rhino),如何使用 print() 函数在一行中打印
- 打印预览没有应用程序页眉和页脚的html表格
- 正在打印图表上的文本
- Rhino打印功能
- 在通过child.print()打印之前,我如何等待图像加载到我的新窗口中
- 如何用javascript打印php数组
- Javascript,从静态函数中打印全局对象
- 试图打印/调用/或提醒数组中的对象:Getting Undefined
- 按压“;输入“;将值打印到控制台日志
- 将数组的拼接分配给自身时,Javascript控制台打印不起作用
- 如何在php中创建一个函数,该函数与文本区域一起工作,通过输入类似[color:red]的内容来打印具有等效颜色的文本
- 从自定义按钮而不是工具栏打印报表查看器
- 在生成打印报表方面,HTML+CSS现在有多成熟
- 为什么每次都打印其他报表