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