0

我需要在按钮单击事件上运行一个循环(通过记录循环并采取一些行动),我想i 使用 UpdatePanel 显示当前循环计数器。它对我不起作用我通过网络搜索但数没有找到类似的例子。它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";
    }
}
4

2 回答 2

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 技术是为了不丢失计数器。它有效,让我知道你是否有不同的意思。

于 2012-10-08T05:15:21.263 回答
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>
于 2012-10-08T04:54:01.647 回答