在点击事件期间使用 ASP.Net 多次更新标签文本

本文关键字:Net 更新 文本 标签 ASP 事件 | 更新日期: 2023-09-27 17:56:43

我有一个简单的应用程序,它是使用 VS2012 用 C# 编写的,在一个 Web 窗体应用程序中。

有一个按钮可以开始处理,我想通过在标签中放置一些文本来向用户更新处理进度。 我想我可以将标签控件放在 UpdatePanel 中,然后在按钮单击事件期间通过调用 UpdatePanel Update() 方法来触发标签文本中的更改。 但是,标签文本仅在点击事件完成后并显示标签文本"处理完成"之后更改。

这是我的xml:


这是背后的代码:

protected void btnCreateFiles_Click(object sender, EventArgs e)
    {
        //Do some stuff
        //Show the message that the application is processing
        lblCaption.Text = "Processing...updating label data";
        ProgressUpdatePanel.ContentTemplateContainer.Controls.Add(lblCaption);
        ProgressUpdatePanel.Update();      
        //Call to database to insert labels
        //Call to database to get the labels 
        lblCaption.Text = "Processing...creating label files.";
        ProgressUpdatePanel.ContentTemplateContainer.Controls.Add(lblCaption);
        ProgressUpdatePanel.Update();   
       //Create Text files from data
        lblCaption.Text = "Processing...updating label counts.";
        ProgressUpdatePanel.ContentTemplateContainer.Controls.Add(lblCaption);
        ProgressUpdatePanel.Update();   
        //Database call to insert count records
        //Create file of count records
        lblCaption.Text = "Processing...completed.";
        ProgressUpdatePanel.ContentTemplateContainer.Controls.Add(lblCaption);
        ProgressUpdatePanel.Update();   
    }

显示的唯一文本是上次更新..."正在处理...完成。

为什么其他更新不会触发标签文本更改?

谢谢

更新的要求

我稍微改变了我的要求。 而不是多次更新。我在进度模板中添加了一个标签,以便在处理开始时显示初始消息,然后在处理完成后使用 lblCaption 标签显示另一条消息。但是,当再次单击该按钮时,将显示两条消息:"请稍候,正在创建文件..."和"正在处理...已完成'。

如何将进度模板中的文本重置为仅显示"请稍候..."消息,而不是"正在处理...完成"消息也?

这是现在的 aspx 文件:


现在,按钮事件处理程序方法如下所示:

protected void btnCreateFiles_Click(object sender, EventArgs e)
        {
            //All of the processing is done here...
            //This works correctly the first time a user click the button
            //But the second time, this text remains and the 'Please wait...' text from the lblProgress label
            // is added above this text.
            ProgressUpdatePanel.ContentTemplateContainer.Controls.Add(lblCaption);
            ProgressUpdatePanel.Update();   
            lblCaption.Text = "Processing...completed.";
        }

更新我已经尝试了以下方法来清除标签中的文本,lblCaption。我已经逐步执行了代码,并且此代码已执行,因为标签文本未清除。
我尝试在 Page_Load() 方法中重置标签,如下所示:

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            txtBoxEnvironment.Text = CurrentEnvironment;
            DAL.setConnectionString(CurrentEnvironment);
        }
        ProgressUpdatePanel.ContentTemplateContainer.Controls.Add(lblCaption);
        ProgressUpdatePanel.Update();   
        lblCaption.Text = "";
    }

我已经删除了ProgressUpatePanel方法,并尝试仅设置标签文本,并且不会重置。

我错过了什么?

在点击事件期间使用 ASP.Net 多次更新标签文本

UpdatePanel 上的 Update 方法无法按预期方式工作。

从 MSDN http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.update(v=vs.110).aspx:如果您有必须执行的服务器代码来确定是否应更新 UpdatePanel 控件,请调用 Update 方法。

如果要模拟进程的进行,可以通过调用隐藏按钮来触发多个部分回发。 每个按钮将执行另一个步骤,并通过javascript调用按钮单击下一个步骤。 这可能容易出错并且效率低下。 但这是做你正在尝试的事情的一种方法。另一种方法是使用 JQuery 并使用 $.ajax 进行多次调用,调用成功回调中的下一步。

以您的代码为例,这是您想要的基本工作示例 - 我理解的方式:

标记

<asp:UpdatePanel ID="ProgressUpdatePanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Button ID="btnCreateFiles" runat="server" Text="Go" OnClick="btnCreateFiles_Click" />
        <asp:Label ID="lblCaption" runat="server" Text="" />
    </ContentTemplate>
</asp:UpdatePanel>
<script type="text/javascript">
    $(document).ready(function () {
        bindButton();
    });
    function bindButton() {
        $('#<%=btnCreateFiles.ClientID%>').on('click', function () {
            $('#<%=lblCaption.ClientID%>').html('Please Wait...');
    });
}
</script>

代码隐藏

    protected void Page_Load(object sender, EventArgs e) {
        if (!IsPostBack) {
            //txtBoxEnvironment.Text = CurrentEnvironment;
            //DAL.setConnectionString(CurrentEnvironment);
        }
        ProgressUpdatePanel.ContentTemplateContainer.Controls.Add(lblCaption);
        ProgressUpdatePanel.Update();
        lblCaption.Text = "";
    }
    protected void btnCreateFiles_Click(object sender, EventArgs e) {
        //All of the processing is done here...
        //This works correctly the first time a user click the button
        //But the second time, this text remains and the 'Please wait...' text from the lblProgress label
        // is added above this text.
        ProgressUpdatePanel.ContentTemplateContainer.Controls.Add(lblCaption);
        ProgressUpdatePanel.Update();
        lblCaption.Text = "Processing...completed.";
        System.Threading.Thread.Sleep(1000);
        ScriptManager.RegisterClientScriptBlock(Page, typeof(string), "bindButton", "bindButton();", true);
    }

我认为如果不编写一些额外的代码,你就无法做你想做的事。 UpdatePanel不会提供对 UI 的多个更新。

本文可能会帮助您实现目标:http://encosia.com/easy-incremental-status-updates-for-long-requests/

这篇文章有点旧,但仍然可能有用:http://msdn.microsoft.com/en-us/magazine/cc163393.aspx

我同意 Rick S 的观点,我们真的需要查看处理代码;您这里的代码非常喜欢处理得太快而无法看到其他消息。 这将导致您看到的问题,其中显示的唯一消息是最后一条消息。