我将报告服务从2008版迁移到另一个服务器2008 R2版。在2008版中,报告可以在Safari上正常运行。新版本的2008 R2报告完全不显示。我所看到的只是参数部分,然后报告为空白。在Chrome中也一样。根据Microsoft的说法,如果受限制,则Safari IS受支持。报告并不复杂。实际上,我创建了一个仅在一行上显示的报告,以查看它是否可以在Safari中显示,但没有,该报告也完全空白。是否有人在Safari上显示SSRS报告?我是否需要弄乱某种配置设置?
我将报告服务从2008版迁移到另一个服务器2008 R2版。在2008版中,报告可以在Safari上正常运行。新版本的2008 R2报告完全不显示。我所看到的只是参数部分,然后报告为空白。在Chrome中也一样。根据Microsoft的说法,如果受限制,则Safari IS受支持。报告并不复杂。实际上,我创建了一个仅在一行上显示的报告,以查看它是否可以在Safari中显示,但没有,该报告也完全空白。是否有人在Safari上显示SSRS报告?我是否需要弄乱某种配置设置?
Answers:
将以下脚本追加到以下文件(在SSRS服务器上)
C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js
function pageLoad() {
var element = document.getElementById("ctl31_ctl10");
if (element)
{
element.style.overflow = "visible";
}
}
注意:如azzlak所述,div的名称并不总是ctl31_ctl10
。对于SQL 2012ctl32_ctl09
和2008 R2,请尝试ctl31_ctl09
。如果此解决方案无效,请从浏览器查看HTML,以查看脚本是否可以正常工作,将overflow:auto
属性更改为overflow:visible
。
插入此样式行到.aspx
页面(或链接.css
文件,如果有)中
#reportViewer_ctl09 {
overflow:visible !important;
}
Chrome和Safarioverflow:auto
以与IE不同的方式呈现。
SSRS HTML是QuirksMode HTML,并取决于IE 5.5错误。非IE浏览器没有IE quirksmode,因此可以正确呈现HTML
SSRS 2008 R2报表生成的HTML页面包含div
具有overflow:auto
样式的,它将报表转换为不可见的报表。
<div id="ctl31_ctl10" style="height:100%;width:100%;overflow:auto;position:relative;">
通过使用Chrome的开发工具()在生成的网页中手动更改overflow:auto
为overflow:visible
,可以查看有关Chrome的报告F12。
我喜欢蒂姆的解决方案,它很简单而且很有效。
但是仍然存在一个问题:用户每次更改参数(我的报告使用参数!)时,AJAX都会刷新div,重写overflow:auto标签,而没有脚本会对其进行更改。
此技术说明详细信息解释了问题所在:
发生这种情况是因为在使用AJAX面板构建的页面中,只有AJAX面板会更改其状态,而不刷新整个页面。因此,
OnLoad
您应用于<body>
代码的事件仅会触发一次:首次加载页面。之后,更改任何AJAX面板将不再触发这些事件。
用户einarq建议此解决方案:
另一个选择是将函数重命名为pageLoad。如果页面上存在此名称的任何函数,则在每次部分更新之后,asp.net ajax也会自动调用该函数。如果这样做,您也可以从body标签中删除onload属性
因此写了解决方案中显示的改进脚本。
ctl32_ctl09
。
仅包括SizeToReportContent="true"
如下所示
<rsweb:ReportViewer ID="ReportViewer1" runat="server" SizeToReportContent="True"...
我正在将Chrome版本21与SQL 2008 R2 SP1配合使用,但以上修复程序均不适用于我。下面是起作用的代码,与其他答案一样,我将这部分代码添加到“ C:\ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js”(在SSRS服务器):
//Fix to allow Chrome to display SSRS Reports
function pageLoad() {
var element = document.getElementById("ctl31_ctl09");
if (element)
{
element.style.overflow = "visible";
}
}
这是一个已知问题。问题在于div标签的样式为“ overflow:auto”,显然不能与Safari和Chrome使用的WebKit很好地实现(请参阅Emanuele Greco的回答)。我不知道如何利用Emanuele的建议来使用RS:ReportViewerHost元素,但是我使用JavaScript解决了它。
问题
解
由于在id为“ ctl31_ctl10”的div元素的style属性中指定了“ overflow:auto”,因此我们无法在样式表文件中覆盖它,因此我使用JavaScript。我将以下代码附加到“ C:\ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js”
function FixSafari()
{
var element = document.getElementById("ctl31_ctl10");
if (element)
{
element.style.overflow = "visible"; //default overflow value
}
}
// Code from http://stackoverflow.com/questions/9434/how-do-i-add-an-additional-window-onload-event-in-javascript
if (window.addEventListener) // W3C standard
{
window.addEventListener('load', FixSafari, false); // NB **not** 'onload'
}
else if (window.attachEvent) // Microsoft
{
window.attachEvent('onload', FixSafari);
}
注意
我似乎没有尝试过SSRS 2005的解决方案,但我认为它不适用于SSRS 2008,因为找不到“ DocMapAndReportFrame”类。
我的解决方案基于上述想法。
function pageLoad() {
var element = document.querySelector('table[id*=_fixedTable] > tbody > tr:last-child > td:last-child > div');
if (element) {
element.style.overflow = "visible";
}
}
它不仅限于特定的ID,而且您无需包括其他任何库(例如jQuery)。
这是我用于Report Server 2008 R2的解决方案
无论Report Server在其表的“ id”属性中将输出供使用的内容如何,它都应该起作用。我认为您不能总是假设它将是“ ctl31_fixedTable”
我混合使用了上面的建议和一些方法,将jQuery库从找到的javascript文件动态加载到页面中 此处
在服务器上,转到目录:C:\ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js
将jquery库jquery-1.6.2.min.js复制到目录中
创建文件ReportingServices.js的备份副本。编辑文件。并将其附加到它的底部:
var jQueryScriptOutputted = false;
function initJQuery() {
//if the jQuery object isn't available
if (typeof(jQuery) == 'undefined') {
if (! jQueryScriptOutputted) {
//only output the script once..
jQueryScriptOutputted = true;
//output the script
document.write("<scr" + "ipt type=\"text/javascript\" src=\"../js/jquery-1.6.2.min.js\"></scr" + "ipt>");
}
setTimeout("initJQuery()", 50);
} else {
$(function() {
// Bug-fix on Chrome and Safari etc (webkit)
if ($.browser.webkit) {
// Start timer to make sure overflow is set to visible
setInterval(function () {
var div = $('table[id*=_fixedTable] > tbody > tr:last > td:last > div')
div.css('overflow', 'visible');
}, 1000);
}
});
}
}
initJQuery();
您可以使用jQuery轻松解决此问题-以及一些难看的技巧:-)
我有一个带有ReportViewer用户控件的asp.net页面。
<rsweb:ReportViewer ID="ReportViewer1" runat="server"...
在文档准备好事件中,我然后启动一个计时器并查找需要溢出修复的元素(如先前的文章所述):
<script type="text/javascript">
$(function () {
// Bug-fix on Chrome and Safari etc (webkit)
if ($.browser.webkit) {
// Start timer to make sure overflow is set to visible
setInterval(function () {
var div = $('#<%=ReportViewer1.ClientID %>_fixedTable > tbody > tr:last > td:last > div')
div.css('overflow', 'visible');
}, 1000);
}
});
</script>
比假设它具有特定ID更好。您可以根据自己的喜好调整计时器。我在这里将其设置为1000毫秒。
Emanuele提供的解决方案对我有用。当我直接从服务器访问报表时,可以看到该报表,但是当我在aspx页面上使用ReportViewer控件时,无法看到该报表。检查呈现的HTML后,我发现了一个id为“ ReportViewerGeneral_ctl09”的div(ReportViewerGeneral是报表查看器控件的服务器ID),其overflow属性设置为auto。
<div id="ReportViewerGeneral_ctl09" style="height: 100%; width: 100%; overflow: auto; position: relative; ">...</div>
我使用Emanuele解释的过程将其更改为可见,如下所示:
function pageLoad() {
var element = document.getElementById("ReportViewerGeneral_ctl09");
if (element) {
element.style.overflow = "visible";
}
}
我已经用过了 在Report.aspx页面上添加对jquery的脚本引用。使用以下内容将JQuery链接到Microsoft事件。使用了Eric的一点建议来设置溢出。
$(document).ready(function () {
if (navigator.userAgent.toLowerCase().indexOf("webkit") >= 0) {
Sys.Application.add_init(function () {
var prm = Sys.WebForms.PageRequestManager.getInstance();
if (!prm.get_isInAsyncPostBack()) {
prm.add_endRequest(function () {
var divs = $('table[id*=_fixedTable] > tbody > tr:last > td:last > div')
divs.each(function (idx, element) {
$(element).css('overflow', 'visible');
});
});
}
});
}
});