无法找到 ReportViewer 渲染完成的事件

11

我想在ReportViewer控件完成渲染后触发一个事件(以移除自定义进度/状态指示器)。我已经探索了ReportViewer控件的事件,但似乎找不到在报表完成时触发的事件。

我正在使用Visual Studio 2010和ASP.NET 4。

感谢您的帮助。

4个回答

13

我知道这个问题已经很旧了,但我对投票方法并不满意。你可以注册一个属性更改监听器来监听isLoading是否有变化(正如这里所描述的那样)。

简而言之,只需在表单元素中加入一些JavaScript代码即可,例如在script manager中:

<asp:ScriptManager ID="scriptManager" runat="server">
    <Scripts>
        <asp:ScriptReference Path="~/Reports/ReportViewer.js" />
    </Scripts>
</asp:ScriptManager>
<rsweb:ReportViewer ID="reportViewer" runat="server"/>

然后连接它并在ReportViewer.js中添加任何客户端逻辑:

Sys.Application.add_load(function () {
    $find("reportViewer").add_propertyChanged(viewerPropertyChanged);
});

function viewerPropertyChanged(sender, e) {
    if (e.get_propertyName() == "isLoading") {
        if ($find("reportViewer").get_isLoading()) {
            // Do something when loading starts
        }
        else {
            // Do something when loading stops
        }
    }
};

这看起来是一个更优雅的解决方案,但我已经没有设置来测试它了。 - Andrew
1
@ahm126:好的,希望其他人也能发现它的用处。 - Matt
根据我的经验,这在IE8上不起作用。其他浏览器都可以。 - Johann
@Johann,那很有趣,因为我们的目标浏览器是IE8,而上述方法对我们有效...我很容易相信一个非直观的IE设置或类似的东西可能会阻碍它。 - Matt
我尝试了那种方式。我可以使用jquery $('#ReportViewer1')访问ReportViewerControl,但是当我尝试添加.add_propertyChanged(viewerPropertyChanged)时,我会收到一个错误,即.add_propertyChanged不是一个函数。 - Sebastian
显示剩余6条评论

5
一种选择是不断轮询isLoading属性,该属性属于客户端 ReportViewer api。如果isLoading属性返回true,则继续显示进度指示器;如果返回false,则隐藏它并停止轮询。 我自己没有尝试过,但根据文档,它应该可以工作。

Josh, 你说得对。我一定是在客户端ReportViewer API的某个地方忽略了它。 以下是我用来告诉我的Silverlight应用程序在报表加载完成后执行某些操作的代码: var rptViewer = $find("<%= ReportViewer1.ClientID %>"); var statusHider = setInterval(function () { if (!rptViewer.get_isLoading()) { slCtl.Content.SilverlightApp.HideStatus(); clearInterval(statusHider); } }, 500); - Andrew
3
建议将该代码更新到答案中,而不是将其挤压成注释。 - Drazen Bjelovuk

0
我使用JQuery来实现这个功能,具体操作如下:
$(document).ready(function () {

document.getElementById('ctl00_ctl00_DefaultContent_AdminContent_reportViewer').ClientController.CustomOnReportLoaded = function () { 
alert('You see this after Report is Generated');
}
});

-1

尝试以下代码片段:

<script type="text/javascript">
    var app = Sys.Application;
    app.add_init(ApplicationInit);

    function ApplicationInit(sender) {
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        $('#ReportViewer1_ctl05').css('width', '1047px');
        if (!prm.get_isInAsyncPostBack()) {
            prm.add_endRequest(EndRequest)
        }
    }

    function EndRequest(sender, args) {
        var reportViewerControlId = "ReportViewer1";
        if (sender._postBackControlClientIDs[0].indexOf(reportViewerControlId) >= 0) {
            // do your stuff
        }
    }
</script>  

当报表渲染完成后,EndRequest函数将被触发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接