0

ボタンクリックイベントでループ(レコードをループして何らかのアクションを実行)を実行する必要があります。UpdatePanelを使用して現在のループカウンターを表示したいと思いますi 。ネットで検索してもうまくいきませんが、似たような例は見つかりませんでした。lblCounterループの完了後にループカウンターが表示されますが、すべてのカウンターについてを表示する必要がありますlblCounter

コードに示されているようにステートメントを遅らせる必要がある場合でも、最善の方法は何ですか。

以下のコードは単なる例です。この例を手伝ってくれる人がいれば幸いです。私は実際にテーブル内の各レコードをループして、すべてのユーザーに電子メールを送信したいと思っています。ユーザーの数は2000r300を超えてはなりません。

メールを送信している間、完了したメールの数でクライアント画面を更新することでしたが、これは更新パネルを使用して達成したい基本的なことです。

マークアップ:

<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 に答える