当计时器滴答时,停止报告查看器

时间:2012-11-20 15:09:56

标签: asp.net visual-studio-2010 reporting-services

我正在尝试使用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>

然后我的报告shell使用该控件:

<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将重绘自己,但页面的其余部分将不会更新。但是,每次计时器滴答时,它都会重绘报告。这非常烦人,因为如果您在报告上打开了日历控件,它就会关闭它。目前为了测试目的,计时器每三秒钟滴答一次这是不现实的,但我仍然不希望在用户尝试使用它时重新绘制报告控件,而不管间隔是什么。有什么想法吗?

1 个答案:

答案 0 :(得分: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);
    }