none
请问如何让Label1中的信息实时更新? RRS feed

  • 问题

  • "正在导入数据,请耐心等待!"为什么不显示呢?

    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            ScriptManager1.RegisterAsyncPostBackControl(Button1);
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            Label1.Text = "正在导入数据,请耐心等待!";
            for (int i = 0; i < 50; i++)
            {
                System.Threading.Thread.Sleep(100);
            }
            Label1.Text = "导入成功!";
        }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
            <asp:ScriptManager ID="ScriptManager1" runat="server">
            </asp:ScriptManager>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            </ContentTemplate>
            </asp:UpdatePanel>
            
            
            <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
        </div>
        </form>
    </body>
    </html>
    

    2012年5月19日 13:31

答案

  • 建议使用UpdateProgress:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CSharp.WebForm1" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
            <asp:ScriptManager ID="ScriptManager1" runat="server">
            </asp:ScriptManager>
        
        </div>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:UpdateProgress ID="UpdateProgress1" runat="server">
                    <ProgressTemplate>
                        正在导入数据,请稍后……
                    </ProgressTemplate>
                </asp:UpdateProgress>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="导入数据" />
        </form>
    </body>
    </html>

    public partial class WebForm1 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {

            }

            protected void Button1_Click(object sender, EventArgs e)
            {
                Thread.Sleep(2000); //延时模拟复杂操作……
                //之后你做的东西
            }
        }


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已编辑 ThankfulHeart 2012年5月20日 1:16
    • 已标记为答案 hkstb 2012年5月20日 3:59
    2012年5月20日 1:12
  • 请用ViewState保存每次的步骤,然后在PreRenderComplete中完成步骤的增减。

    ublic partial class WebForm1 : System.Web.UI.Page
        {
            /// <summary>
            /// 自动保存到执行第几步了……
            /// </summary>
            private int Steps
            {
                get
                {
                    return ViewState["step"]==null?1:(int)ViewState["step"];
                }
                set
                {
                    ViewState["step"] = value;
                }
            }
    
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            protected void Button1_Click(object sender, EventArgs e)
            {
                Thread.Sleep(2000);
                switch (Steps)
                {
                case1://做你的事情……
                }
    
            }
    
            protected override void OnPreRenderComplete(EventArgs e)
            {
                base.OnPreRenderComplete(e);
                (UpdatePanel1.FindControl("lbInfo") as Label).Text = "正在处理第" + Steps + "步……";
                Steps++;
            }
        }

    另外,请把ProgressTemplate模板中文字换成Label控件。

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:UpdateProgress ID="UpdateProgress1" runat="server">
                    <ProgressTemplate>
                     <asp:Label ID="lbInfo" runat="server" Text="请稍后……" />
                    </ProgressTemplate>
                </asp:UpdateProgress>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已编辑 ThankfulHeart 2012年5月20日 3:22
    • 已标记为答案 hkstb 2012年5月20日 3:59
    2012年5月20日 3:21

全部回复

  • 建议使用UpdateProgress:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CSharp.WebForm1" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
            <asp:ScriptManager ID="ScriptManager1" runat="server">
            </asp:ScriptManager>
        
        </div>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:UpdateProgress ID="UpdateProgress1" runat="server">
                    <ProgressTemplate>
                        正在导入数据,请稍后……
                    </ProgressTemplate>
                </asp:UpdateProgress>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="导入数据" />
        </form>
    </body>
    </html>

    public partial class WebForm1 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {

            }

            protected void Button1_Click(object sender, EventArgs e)
            {
                Thread.Sleep(2000); //延时模拟复杂操作……
                //之后你做的东西
            }
        }


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已编辑 ThankfulHeart 2012年5月20日 1:16
    • 已标记为答案 hkstb 2012年5月20日 3:59
    2012年5月20日 1:12
  • 首先谢谢 编程志愿者 的热心回复。

    可是如果一个Button1_Click中有几个环节需要不同的提示,如何动态改变UpdateProgress的提示内容呢?

    我在MSDN上看了看UpdateProgress的介绍,好像没发现。

    2012年5月20日 2:04
  • 请用ViewState保存每次的步骤,然后在PreRenderComplete中完成步骤的增减。

    ublic partial class WebForm1 : System.Web.UI.Page
        {
            /// <summary>
            /// 自动保存到执行第几步了……
            /// </summary>
            private int Steps
            {
                get
                {
                    return ViewState["step"]==null?1:(int)ViewState["step"];
                }
                set
                {
                    ViewState["step"] = value;
                }
            }
    
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            protected void Button1_Click(object sender, EventArgs e)
            {
                Thread.Sleep(2000);
                switch (Steps)
                {
                case1://做你的事情……
                }
    
            }
    
            protected override void OnPreRenderComplete(EventArgs e)
            {
                base.OnPreRenderComplete(e);
                (UpdatePanel1.FindControl("lbInfo") as Label).Text = "正在处理第" + Steps + "步……";
                Steps++;
            }
        }

    另外,请把ProgressTemplate模板中文字换成Label控件。

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:UpdateProgress ID="UpdateProgress1" runat="server">
                    <ProgressTemplate>
                     <asp:Label ID="lbInfo" runat="server" Text="请稍后……" />
                    </ProgressTemplate>
                </asp:UpdateProgress>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已编辑 ThankfulHeart 2012年5月20日 3:22
    • 已标记为答案 hkstb 2012年5月20日 3:59
    2012年5月20日 3:21
  • 非常感谢。又学习了很多新知识。
    2012年5月20日 3:59
  • 非常感谢。又学习了很多新知识。
    不用谢,希望再来MSDN交流……^_^

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月20日 4:34