我需要在按钮单击事件上运行循环(循环记录并采取一些操作),我想使用UpdatePanel显示当前循环计数器i
。它不适合我,我通过网络搜索,但数不找到类似的例子。它在完成循环后显示lblCounter
循环计数器,而我需要为每个计数器显示lblCounter
。
即使我必须在代码中将语句延迟显示,最好的方法是什么。
下面的代码只是一个例子。如果有人可以帮我这个例子,我将不胜感激。我实际上想循环遍历表格中的每条记录。向所有用户发送电子邮件。用户数不会超过200 0r 300。
在发送电子邮件的同时,我要用已完成的电子邮件更新客户端屏幕,这是我想要使用更新面板实现的基本功能。
标记:
<asp:Button ID="btnLoop" runat="server" Text="Start" onclick="btnLoop_Click" /><br />
<asp:UpdatePanel ID="updPanelNewsletterProgress" runat="server"
UpdateMode="Conditional" >
<ContentTemplate>
<asp:Label ID="lblCounter" runat="server" Text=""></asp:Label><br />
</ContentTemplate>
</asp:UpdatePanel>
代码:
protected void btnLoop_Click(object sender, EventArgs e)
{
for (int i = 0; i < 100; i++)
{
System.Threading.Thread.Sleep(2000);
// take some action like send email to user XXX
lblCounter.Text = "Counter " + i.ToString() + " of 100";
}
}
答案 0 :(得分:2)
这是我的解决方案:
<asp:UpdatePanel ID="updPanelNewsletterProgress" runat="server" UpdateMode="Conditional" >
<Triggers>
<asp:PostBackTrigger ControlID="Timer1" />
</Triggers>
<ContentTemplate>
<asp:Label ID="lblCounter" runat="server" Text=""></asp:Label><br />
</ContentTemplate>
</asp:UpdatePanel>
protected void Button1_Click(object sender, EventArgs e)
{
Timer1.Enabled = true;
}
protected void Timer1_Tick(object sender, EventArgs e)
{
int i;
int.TryParse(ViewState["i"] != null ? ViewState["i"].ToString() : "0", out i);
if(i == 100)
Timer1.Enabled = false;
lblCounter.Text = "Counter " + i.ToString() + " of 100";
ViewState["i"] = ++i;
}
我使用ViewState技术以免丢失计数器。 如果你的意思不同,请告诉我。
答案 1 :(得分:0)
您可以使用Asp Timer控件来更新进度。
<!-- The timer which used to update the progress. -->
<asp:Timer ID="Timer1" runat="server" Interval="100" Enabled="false" ontick="Timer1_Tick"></asp:Timer>
<!-- The Label which used to display the progress and the result -->
<asp:Label ID="lblCounter" runat="server" Text=""></asp:Label><br /> </ContentTemplate>
</asp:UpdatePanel>
或者您可以使用后台工作者类来更新单独线程中的进度。
或者您也可以使用更新进度控制进行更新,如下所示:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdateProgress runat="server" id="PageUpdateProgress">
<ProgressTemplate>
Loading...
</ProgressTemplate>
</asp:UpdateProgress>
<asp:UpdatePanel runat="server" id="Panel">
<ContentTemplate>
<asp:Button runat="server" id="UpdateButton" onclick="UpdateButton_Click" text="Update" />
</ContentTemplate>
</asp:UpdatePanel>
</form>