2009-05-29 73 views

回答

1

我剛剛遇到同樣的問題,並把一個骯髒的修復地方!我使用報告查看器控件在我自己的自定義ASP.Net頁面中顯示報告。這可以幫助我,因爲我可以在我的外部主機頁面中添加一些額外的腳本。以下是我所做的:

我在我的頁面上打開了MaintainScrollPositionOnPostback,因爲我很懶,只是劫持他們的函數來計算滾動條的位置。

我設置了一個間隔來捕獲滾動條Y位置每50ms。

我將事件處理程序附加到SSRS IFrame的加載事件,該事件處理程序會將滾動條設置回以前的位置。

當SSRS發回iframe加載事件時。此時SSRS惱人地調整了滾動條。我的事件處理程序啓動並放回!這非常噁心,但是完成這項工作。

代碼:

<script language="javascript"> 


    $(document).ready(function() { 

     $('iframe').load(function() { 
      resetScrollbar(); 
     }); 

    }); 

    var lastGoodScrollY = 0; 
    var interval = window.setInterval(getScrollY, 50); 

    function getScrollY() { 
     lastGoodScrollY = WebForm_GetScrollY(); 
    } 

    function resetScrollbar() { 
     window.scrollTo(0, lastGoodScrollY); 
    } 

</script> 
0

的澄清溶液很簡單,如果你知道如何做到這一點。 ;)

所有你需要做的就是將下面的代碼是什麼:

<script type="text/javascript" language="javascript"> 

    $(document).ready(function() { 
     $('.A0').get(0).ClientController.CustomOnReportLoaded = function() { 
      this.m_reportObject.m_navigationId = null; 
     }; 
    }); 

</script> 

其中 「A0」 從$('.A0')是分配給ReportViewer控件的CSS類名。

僅供參考我粘貼方法的初始化ReportViewer控件:

protected void InitializeReportViewer(string ID) 
    { 
     string reportsPath = ConfigGetter.GetReportsPath(); 
     string reportingServerUrl = ConfigGetter.GetReportingServerUrl(); 

     Instance = new ReportViewer(); 
     Instance.ID = ID; 
     Instance.CssClass += ID; 
     Instance.ProcessingMode = ProcessingMode.Remote; 
     Instance.ServerReport.ReportServerUrl = new Uri(reportingServerUrl); 
     Instance.ServerReport.ReportPath = reportsPath + Config.Filename; 
     Instance.Enabled = true; 
     Instance.InternalBorderStyle = BorderStyle.None; 
     Instance.EnableViewState = true; 
     if (Config.AutomaticSize) 
     { 
      Instance.AsyncRendering = false; 
      Instance.SizeToReportContent = true; 
     } 
     else 
     { 
      Instance.Width = Config.Width; 
      Instance.Height = Config.Height; 
     } 


     Instance.ShowParameterPrompts = false; 
     Instance.ShowToolBar = false; 

     SetParameters(); 
    } 

被調用了上面的例子,如:

InitializeReportViewer("A0"); 

下面的解釋,爲什麼它的工作原理:

ReportViewer控件生成大量的javascript代碼,其中包含以下其他內容:

function OnLoadReport(reloadDocMap) 
{ 
    this.m_clientController.OnReportLoaded(this, reloadDocMap); 

    if (null != this.m_navigationId && this.m_navigationId != "") 
     window.location.replace("#" + this.m_navigationId); 

    if (this.m_autoRefreshAction != null) 
     setTimeout(this.m_autoRefreshAction, this.m_autoRefreshInterval); 
} 
RSReport.prototype.OnLoadReport = OnLoadReport; 


function OnReportLoaded(reportObject, reloadDocMap) 
{ 
    this.m_reportObject = reportObject; 
    this.CurrentPage = reportObject.m_pageNumber; 
    this.TotalPages = reportObject.m_totalPages; 
    this.m_searchStartPage = reportObject.m_searchStartPage; 

    // Update the client side page number so that it is available to the server object 
    // if it was changed asynchronously. 
    var clientCurrentPage = GetControl(this.m_clientCurrentPageID); 
    if (clientCurrentPage != null) 
     clientCurrentPage.value = this.CurrentPage; 

    // If there is a document map, display it 
    if (this.HasDocumentMap()) 
    { 
     // This method is called each time the report loads. This happens 
     // for page navigations and report actions. For many of these cases, 
     // the doc map didn't change, so don't reload it. 
     if (reloadDocMap) 
     { 
      if (this.CanDisplayBuiltInDocMap() && this.m_docMapUrl != "") 
      { 
       var docMapReportFrame = frames[this.m_docMapReportFrameID]; 
       docMapReportFrame.frames["docmap"].location.replace(this.m_docMapUrl); 
      } 

      this.CustomOnReloadDocMap(); 
     } 

     if (this.m_docMapVisible && this.CanDisplayBuiltInDocMap()) 
      this.SetDocMapVisibility(true); 
    } 

    this.CustomOnReportLoaded(); 
} 

惱人的滾動是因爲這部分代碼的:

if (null != this.m_navigationId && this.m_navigationId != "") 
     window.location.replace("#" + this.m_navigationId); 

所以我們需要設置this.m_navigationId爲null。 哪裏?

在這部分代碼this.m_clientController.OnReportLoaded之前調用方法,最後調用方法CustomOnReportLoaded(),所以我們只需要在這個方法中爲m_navigationId設置null。 而我們正在這樣做。瞧!

0

與ReportViewer控件10.0.30319.1配合使用時適用於我。不是很漂亮,因爲它涉及_ReportArea,它應該是私有的,並且根本不需要ScrollToTarget函數,這在某些情況下可能是需要的。另一種方法是通過訪問控件來訪問ReportPage的這個函數和\或NavigationId屬性,但是您需要知道確切的控件ID - 在我的情況下,它是reportViewerDivId_ctl09,它是從rsweb的客戶端ID生成的: ReportViewer Asp.Net控件。 參見第二示例

實施例1:

$(window).load(function() { 

    if (Microsoft && Microsoft.Reporting && Microsoft.Reporting.WebFormsClient) { 
     var rpp = Microsoft.Reporting.WebFormsClient._ReportArea; 
     if (rpp && rpp.prototype) { 
      rpp.prototype.ScrollToTarget = function() { }; 
     } 
    } 
}); 

實施例2:

/* DOESN'T WORK!*/ 
var rp = $get('reportViewerDivId_ctl09_ReportControl'); /* rp.control is ReportPage */ 
rp[0].control.NavigationId = null; 
/*THE BELOW WORKED*/ 
var ra = $('#reportViewerDivId_ctl09'); /*ra[0].control is ReportArea*/ 
if (ra[0] && ra[0].control && ra[0].control.ScrollToTarget) { 
    ra[0].control.ScrollToTarget = function() { }; /*overriding the function so that anoying scroll on Sort doesn't happen */ 
} 
1

只要overright中的ReportViewer JS天然ScrollToTarget功能到ReportViewerWebForm.aspx:

$(document).ready(function() { 
    Microsoft.Reporting.WebFormsClient._ReportArea.prototype.ScrollToTarget = function(){}; 
}); 
+0

清潔和它適用於IE11和Chrome。適合我!應該標記爲答案。 – 2018-01-16 18:05:56