2012-11-20 73 views
0

我試圖創建一個使用asp.net VS2010中報告的主機。這是我第一次嘗試做Web開發,所以我可能會犯一個非常明顯的錯誤。最終目標是一臺主機,不僅顯示給用戶的報告,但還跟蹤他們多久看報告。但是,我無法擺脫這個令人討厭的問題,即每次我的計時器打勾報告都會重繪。停止的ReportViewer當計時器滴答

我有一個UsageAuditor控制,它只是一個更新面板與定時器和一個標籤在它:

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
<ContentTemplate> 
    <asp:Timer runat="server" ID="Timer1" Interval="3000" OnTick="Timer1_Tick"/> 
    <asp:Label ID="lblTime" runat="server" Text="Not updated yet"></asp:Label> 
</ContentTemplate> 

然後我的報告外殼使用了控制:

<body> 
<form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"/> 
    <uc1:UsageAuditor ID="ua1" runat="server" /> 
    <rsweb:reportviewer ID="reportViewer" runat="server" Font-Names="Verdana" 
     Font-Size="8pt" InteractiveDeviceInfos="(Collection)" ProcessingMode="Remote" 
     WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt" 
     Height="800px" Width="1000px" AsyncRendering="True">    
    </rsweb:reportviewer> 
</form> 
</body> 

而計時器滴答只需更新標籤:

protected void Timer1_Tick(object sender, EventArgs e) 
{ 
    lblTime.Text = String.Format("Updated at {0}", DateTime.Now.ToString()); 
} 

所以我想通過definining在UpdatePanel UpdatePanel的將重繪iteself之外我的ReportViewer,但頁面的其餘部分將不會被更新。但是,每當計時器滴答時,都會重新繪製報告。這非常煩人,因爲如果您在報告中打開日曆控件,它會關閉它。目前用於測試目的計時器滴答每三秒鐘這是不現實的,但我還是不希望報告控制越來越重繪當用戶試圖不論間隔的使用它。有任何想法嗎?

+0

如果是我,我會將計時器移動到客戶端與像jQuery或純JavaScript的東西。 (而不是在服務器上)。如果可能的話,它會解決您的問題,並在我看來更有效率。 – puddleglum

回答

0

好吧,我發現了一個帖子說ReportViewer and UpdatePanel do not mix

由於報表查看器使用腳本的方式,它是目前無法與一個UpdatePanel兼容。我們意識到這個問題,並正在研究必要的更改以使ReportViewer在UpdatePanel中工作。但目前沒有解決辦法。雖然它可能會出現,你可以得到在這種情況下工作的簡單介紹,一些更微妙的報表瀏覽器的行爲仍然會被打破,比如它的代碼,保持會議的報告報告活着的時候留在瀏覽器窗口中打開。

閱讀puddleglums建議後,我想到了爲什麼我覺得我需要使用計時器來更新我的使用信息。如果我可以在用戶離開頁面時捕獲這些內容,那麼確實不需要在間隔上進行上傳。

this example我加了一些Java腳本來調用接近服務器端功能:

<script type="text/javascript"> 
    //<![CDATA[ 
    function HandleClose() { 
     var QAid = document.getElementById('QAReportRequest'); 
     PageMethods.SetReportViewEndTime(QAid.value); 
    } 
    //]]> 
</script> 

添加於onunload的的HandleClose呼叫和隱藏式到我的身體:

<body onunload="HandleClose()"> 
    <form id="form1" runat="server"> 
    <input id="QAReportRequest" type="hidden" runat="server"/> 
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"/> 
    <rsweb:reportviewer ID="reportViewer" runat="server" Font-Names="Verdana" 
    Font-Size="8pt" InteractiveDeviceInfos="(Collection)" ProcessingMode="Remote" 
    WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt" 
    Height="800px" Width="1000px"> 
    </rsweb:reportviewer>   
    </form> 
</body> 

然後創建服務器端功能:

[WebMethod] 
    public static void SetReportViewEndTime(string ID) 
    { 
     QAReportingManager manager = new QAReportingManager(); 
     QAReportUsageResponse element = manager.GetQAReportUsage(long.Parse(ID)); 
     QAReportUsageRequest request = new QAReportUsageRequest 
     { 
      ID = element.ID, 
      userID = element.userID, 
      userName = element.userName, 
      reportName = element.reportName, 
      startTime = element.startTime, 
      endTime = DateTime.Now, 
      department = "Unknown" 
     }; 
     manager.SaveQAReportUsage(request); 
    }