使用ASP.Net中的Ajax每2秒显示一次当前循环计数器

时间:2012-10-08 04:37:22

标签: c# jquery asp.net ajax webforms

我需要在按钮单击事件上运行循环(循环记录并采取一些操作),我想使用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";
    }
}

2 个答案:

答案 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>