Sunday 1 April 2012

Double scrollbars in ReportViewer for IE8

Today I came across a very strange bug with reportviewer (there seem to be many) which only manifested itself in IE8.  The problem was that it created a scrollpane within a scrollpane so there were 2 sets of scrollbars.

Upon viewing the source I was able to track the problem down to the oReportDiv element which had a style attribute containing "overflow: auto;".  I could see that by removing this overflow style or setting it to "visible" the extra scroll bars would disappear.  The final solution was a challenge was the code here is contained within an iframe and I struggled with many JQuery attempts to remove the style.  Eventually I was able to remove it using the following:


    window.onload = function () {
        var viewer = document.getElementById("<%=reportViewer.ClientID %>");
        var frame = document.getElementById("ReportFrame<%=reportViewer.ClientID %>");
        if (frame != null && viewer != null) {
            var reportDiv = eval("ReportFrame<%=reportViewer.ClientID %>").document.getElementById("report").contentDocument.getElementById("oReportDiv");
            reportDiv.removeAttribute("style");
        }
    }

An event which fires in ReportViewer after the report is generated


I searched for quite a while to find a way to run a client side script whenever the ASP.Net SSRS ReportViewer control has finished rendering/generating a report.  I could not find one documented but when looking in the report viewers resulting html source I found mention of ClientController.CustomOnReportLoaded which was set to an empty function.  Using the JQuery ready function I was able to attach code to this event and have it run only after the report was generated.


$(document).ready(function () {

document.getElementById('ctl00_ctl00_DefaultContent_AdminContent_reportViewer').ClientController.CustomOnReportLoaded = function () {

        alert('You see this after Report is Generated');
        }
        });