Existem muitos exemplos de barras de progresso na Internet, mas muitas delas são tempos estimados e não podem refletir verdadeiramente o progresso real da tarefa. Combinei multi-threading e ShowModalDialog para criar uma barra de progresso em tempo real. O princípio é muito simples: use um thread para iniciar uma tarefa de longo prazo, defina uma Sessão, altere o valor da Sessão quando a tarefa prosseguir para diferentes estágios. e use ShowModalDialog para abrir o thread quando ele for iniciado. Uma janela da barra de progresso, que é constantemente atualizada para obter o valor da sessão e refletir o progresso em tempo real. Vamos dar uma olhada no código específico: (Baixe o código-fonte no final do artigo)
Primeiro crie uma nova página Default.aspx,
Código do cliente:
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="servidor">
<br>
<br>
<asp:Button id="Button1" runat="server" Text="Iniciar tarefa longa!"></asp:Button>
</form>
</body>
Código do lado do servidor:
usando o sistema;
usando System.Collections;
usando System.ComponentModel;
usando System.Data;
usando System.Drawing;
usando System.Web;
usando System.Web.SessionState;
usando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.HtmlControls;
usando System.Text
namespace WebProgressBar;
{
/**//// <resumo>
/// Descrição resumida para _Default.
/// </sumário>
classe pública _Default: System.Web.UI.Page
{
System.Web.UI.WebControls.Button protegido Button1;
private void Page_Load (remetente do objeto, System.EventArgs e)
{
//Coloque aqui o código do usuário para inicializar a página
}
Código gerado pelo Web Form Designer#region Código gerado pelo Web Form Designer
substituir void protegido OnInit (EventArgs e)
{
//
// CODEGEN: Esta chamada é exigida pelo ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/**//// <resumo>
/// Método necessário para suporte do Designer - não modifique
/// o conteúdo deste método com o editor de código.
/// </sumário>
privado vazio InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load })
;
#endregion
privado void LongTask()
{
//Simula tarefas de longo prazo
//Cada tarefa de simulação de loop prossegue para diferentes estágios
para(int i=0;i<11;i++)
{
System.Threading.Thread.Sleep(1000);
//Defina o valor do estado de cada estágio para exibir o progresso atual
Sessão["Estado"] = i+1;
}
//A tarefa termina
Sessão["Estado"] = 100
}
public static void OpenProgressBar(System.Web.UI.Page Page)
{
StringBuilder sbScript = new StringBuilder()
sbScript.Append("<linguagem de script='JavaScript' type='text/javascript'>n");
sbScript.Append("<!--n");
//Requer suporte para IE5.5 ou superior
sbScript.Append("window.showModalDialog('Progress.aspx','','dialogHeight: 100px; dialogWidth: 350px; borda: elevada; centro: Sim; ajuda: Não; redimensionável: Não; status: Não; rolagem: Não ;');n");
//Use window.open abaixo do IE5.5
//sbScript.Append("window.open('Progress.aspx','', 'height=100, width=350, barra de ferramentas =não, barra de menu=não, barras de rolagem=não, redimensionável=não, localização=não, status =não');n");
sbScript.Append("// -->n");
sbScript.Append("</script>n");
Page.RegisterClientScriptBlock("OpenProgressBar", sbScript.ToString());
}
private void Button1_Click(objeto remetente, System.EventArgs e)
{
System.Threading.Thread thread = novo System.Threading.Thread(novo System.Threading.ThreadStart(LongTask));
thread.Start();
Sessão["Estado"]=1;
OpenProgressBar(esta.Página);
}
}
}
Crie uma nova página da barra de progresso Progress.aspx
Cliente:
Adicione <base target="_self"> ao cabeçalho
<corpo MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="servidor">
<asp:Label id="lblMessages" runat="server"></asp:Label>
<asp:Panel id="panelBarSide" runat="servidor" Width="300px" BorderStyle="Sólido" BorderWidth="1px"
ForeColor="Prata">
<asp:Panel id="panelProgress" runat="server" Width="10px" BackColor="Green"></asp:Panel>
</asp:Painel>
<asp:Label id="lblPercent" runat="server" ForeColor="Blue"></asp:Label>
</form>
</body>
Lado do servidor:
usando o sistema;
usando System.Collections;
usando System.ComponentModel;
usando System.Data;
usando System.Drawing;
usando System.Web;
usando System.Web.SessionState;
usando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.HtmlControls
namespace WebProgressBar
;
{
/**//// <resumo>
/// Descrição resumida do Progress.
/// </sumário>
Progresso da classe pública: System.Web.UI.Page
{
System.Web.UI.WebControls.Label lblMessages protegido;
protegido System.Web.UI.WebControls.Panel panelProgress;
protegido System.Web.UI.WebControls.Panel panelBarSide;
protegido System.Web.UI.WebControls.Label lblPercent;
estado interno privado = 0;
private void Page_Load (remetente do objeto, System.EventArgs e)
{
//Coloque aqui o código do usuário para inicializar a página
if(Sessão["Estado"]!=null)
{
estado = Convert.ToInt32(Sessão["Estado"].ToString());
}
outro
{
Sessão["Estado"]=0;
}
if(estado>0&&estado<=10)
{
this.lblMessages.Text = "Tarefa realizada!";
this.panelProgress.Width = estado*30;
this.lblPercent.Text = estado*10 + "%";
Page.RegisterStartupScript("","<script>window.setTimeout('window.Form1.submit()',100);</script>");
}
se(estado==100)
{
this.panelProgress.Visible = falso;
this.panelBarSide.Visible = falso;
this.lblMessages.Text = "Tarefa concluída!";
Page.RegisterStartupScript("","<script>window.close();</script>");
}
}
Código gerado pelo Web Form Designer#region Código gerado pelo Web Form Designer
substituir void protegido OnInit (EventArgs e)
{
//
// CODEGEN: Esta chamada é exigida pelo ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/**//// <resumo>
/// Método necessário para suporte do Designer - não modifique
/// o conteúdo deste método com o editor de código.
/// </sumário>
privado vazio InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load })
;
#endregion
}
}
Download do código-fonte: http://justicfu.cnblogs.com/archive/2006/06/29/438433.html