0

我正在尝试使用 asp.net 在 vs2010 中创建报告主机。这是我第一次尝试进行 Web 开发,所以我可能犯了一个非常明显的错误。最终目标是主机不仅向用户显示报告,而且还跟踪他们查看报告的时间。但是,我无法解决这个烦人的问题,即每次我的计时器滴答作响时,都会重新绘制报告。

我有一个 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());
}

所以我想通过在 UpdatePanel 之外定义我的 ReportViewer,UpdatePanel 会自己重绘,但页面的其余部分不会更新。但是,每次计时器滴答作响时,它都会重新绘制报告。这很烦人,因为如果您在报表上打开日历控件,它会关闭它。目前出于测试目的,计时器每三秒滴答一次,这是不现实的,但我仍然不希望在用户尝试使用它时重绘报告控件,而不管时间间隔如何。有任何想法吗?

4

1 回答 1

0

好吧,我发现一个帖子说ReportViewer 和 UpdatePanel 不要混合

由于报表查看器使用脚本的方式,它目前与 UpdatePanel 不兼容。我们已经意识到这个问题,并研究了使 ReportViewer 在 UpdatePanel 中工作的必要更改。但目前,没有变通办法。虽然看起来您可以在这种情况下获得简单的报表,但一些更微妙的报表查看器行为仍然会被破坏,例如当浏览器窗口保持打开状态时保持报表会话处于活动状态的代码。

在阅读了 puddleglums 的建议后,我思考了为什么我觉得我需要使用计时器来更新我的使用信息。如果我可以捕获用户离开页面的时间,那么间隔更新确实是不必要的。

这个示例之后,我添加了一些 java 脚本来在关闭时调用服务器端函数:

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

在我的正文中添加了 onunload 和 hidden 类型的 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);
    }
于 2012-11-21T15:56:05.620 回答