protected void SubmitButtonClicked(object sender, EventArgs e)
{
System.Timers.Timer timer = new System.Timers.Timer();
---
---
//line 1
get_datasource();
String message = "submitted.";
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "popupAlert", "popupAlert(' " + message + " ');", true);
timer.Interval = 30000;
timer.Elapsed += new ElapsedEventHandler(timer_tick);
// Only raise the event the first time Interval elapses.
timer.AutoReset = false;
timer.Enabled = true;
}
protected void timer_tick(object sender, EventArgs e)
{
//line 2
get_datasource();
GridView2.DataBind();
}
问题在于正在显示的网格视图中的数据...因为当调用第1行之后的get_datasource时,更新的数据显示在网格视图中,因为它是回发事件但是当计时器事件handler正在调用timer_tick事件,调用get_datasource函数,但之后更新的数据在网格视图中不可见。由于timer_tick不是回发事件,因此无法更新
答案 0 :(得分:4)
实现它的服务器端计时器不适用于您要实现的目标。
如果您在更新面板中同时包含计时器和gridview,则每次tick事件触发时,计时器都会触发回发,并且您可以更新数据。
这是一篇很棒的博文,旨在帮助您:http://mattberseth.com/blog/2007/08/using_the_ajax_timer_control_a.html
<asp:UpdatePanel runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:GridView ID="GridView2" runat="server">
</asp:GridView>
<asp:Timer id="Timer1" runat="server" Interval="30000" OnTick="Timer_Tick" Enabled="false" />
<asp:Button ID="Button1" runat="server" Text="Update" OnClick="SubmitButtonClicked" />
</ContentTemplate>
</asp:UpdatePanel>
服务器端代码:
private void Timer_Tick(object sender, EventArgs args)
{
get_datasource();
GridView2.DataBind();
Timer1.Enabled = false;
}
protected void SubmitButtonClicked(object sender, EventArgs e)
{
String message = "submitted.";
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "popupAlert", "popupAlert(' " + message + " ');", true);
get_datasource();
GridView2.DataBind();
Timer1.Enabled = true;
}
答案 1 :(得分:1)
你不能使用这样的计时器。虽然ASP.NET试图隐藏HTTP的请求/响应周期,但循环仍然存在,因此您不能在回发中执行任何您喜欢的操作:您仍需要了解正在回送HTTP响应以响应HTTP请求。
是否有任何特定的原因为什么你要尝试使用这样的计时器?这似乎对我没有意义。你想要实现的是什么?