【问题标题】:Updating label text several times during click event using ASP.Net使用 ASP.Net 在单击事件期间多次更新标签文本
【发布时间】:2014-05-15 21:50:31
【问题描述】:

我有一个使用 VS2012 用 C# 编写的简单应用程序,位于 Web 表单应用程序中。

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

这是我的 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 方法并尝试仅设置标签文本但未重置。

我错过了什么?

【问题讨论】:

  • 请出示相关客户代码。
  • 我拥有的唯一客户端代码是上面显示的 xml。我没有任何 javascript 等。

标签: c# asp.net updatepanel


【解决方案1】:

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);
    }

【讨论】:

  • 在 MSDN 链接中它声明如下:“UpdatePanel 控件的内容在以下情况下更新:如果 UpdateMode 属性设置为 Conditional,并且发生以下情况之一:您调用UpdatePanel 控件的 Update 方法显式。”我多次显式调用 Update() 方法,但它仅在处理完成后更新面板
  • 正确。毫无疑问,在该方法中执行底层代码。但是,您在单个异步 HTTP 请求中多次调用 Update。当该请求完成时,返回的响应将包含您将属性设置为的最后一个状态的 HTML。在您的情况下,“处理中......已完成。”
  • 您可以通过启动 Fiddler 或 Firebug 并对代码进行调试步骤来更好地了解我在说什么。当您到达点击事件的最后一行时,标签的值将是您设置的最后一个值,即返回的 HTML。
  • 感谢您的 cmets 和建议。我稍微改变了我的要求。而不是多次更新。我在进度模板中添加了一个标签,以在处理开始时显示初始消息,然后在处理完成时使用 lblCaption 标签显示另一条消息。但是,当第二次单击该按钮时,会显示两条消息:“正在创建文件……请稍候……”和“正在处理……已完成”。如何重置进度模板中的文本以仅显示“请稍候...”消息?
  • 我最初可能会使用 javascript (JQuery) 来更改它,然后让回发更改它以完成。类似(我没有测试过)$(document).ready(function(){ $('#&lt;%=btnCreateFiles.ClientID%&gt;').click(function(){ $('#&lt;%=lblCaption.ClientID%&gt;').html('Please Wait...'); }); }); 抱歉——我无法正确格式化
【解决方案2】:

我认为如果不编写一些额外的代码,您将无法做自己想做的事情。 UpdatePanel 不会为 UI 提供多个更新。

这篇文章可能会帮助你到达那里:http://encosia.com/easy-incremental-status-updates-for-long-requests/

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

【讨论】:

  • 感谢您的 cmets 和建议。我稍微改变了我的要求。而不是多次更新。我在进度模板中添加了一个标签,以在处理开始时显示初始消息,然后在处理完成时使用 lblCaption 标签显示另一条消息。但是,当第二次单击该按钮时,会显示两条消息:“正在创建文件……请稍候……”和“正在处理……已完成”。如何重置进度模板中的文本以仅显示“请稍候...”消息?
【解决方案3】:

我同意 Rick S 我们确实需要查看处理代码;您在此处拥有的代码不仅会处理得太快而无法查看其他消息。这将导致您看到的问题是唯一显示的消息是最后一条消息。

【讨论】:

  • 我在代码背后的代码中添加了更多细节。虽然不相关。我进行了几次数据库调用,但确实需要时间才能完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多