ToolStripProgressBar (Clase) (System.Windows.Forms)

Cambiar vista:
Sin script
Biblioteca de clases de .NET Framework
ToolStripProgressBar (Clase)

Actualización: noviembre 2007

Representa un control de barra de progreso de Windows contenido en un control StatusStrip.

Espacio de nombres:  System.Windows.Forms
Ensamblado:  System.Windows.Forms (en System.Windows.Forms.dll)
Sintaxis

Visual Basic (Declaración)
Public Class ToolStripProgressBar _
	Inherits ToolStripControlHost
Visual Basic (Uso)
Dim instance As ToolStripProgressBar
C#
public class ToolStripProgressBar : ToolStripControlHost
Visual C++
public ref class ToolStripProgressBar : public ToolStripControlHost
J#
public class ToolStripProgressBar extends ToolStripControlHost
JScript
public class ToolStripProgressBar extends ToolStripControlHost
Comentarios

ToolStripProgressBar es el ProgressBar optimizado para el alojamiento en ToolStrip. En el nivel ToolStripProgressBar se expone un subconjunto de las propiedades y los eventos del control alojado, pero se puede obtener acceso total al control ProgressBar subyacente mediante la propiedad ProgressBar.

Un control ToolStripProgressBar indica visualmente el progreso de una operación larga. El control ToolStripProgressBar muestra una barra que se llena de izquierda a derecha con el color de resaltado del sistema a medida que progresa la operación.

45wz2adw.alert_note(es-es,VS.90).gif Nota:

El control ToolStripProgressBar sólo puede tener orientación horizontal.

Normalmente, el control ToolStripProgressBar se utiliza cuando una aplicación realiza tareas como copiar archivos o imprimir documentos. Los usuarios de una aplicación podrían pensar que ésta no responde si no se les ofrece una señal visual. Utilice ToolStripProgressBar para notificar al usuario que la aplicación está realizando una tarea larga y que la aplicación todavía está respondiendo.

Las propiedades Maximum y Minimum definen el intervalo de valores que representarán el progreso de una tarea. Normalmente, la propiedad Minimum se establece en cero, y la propiedad Maximum se establece en un valor que indica que la tarea ha terminado. Por ejemplo, para mostrar correctamente el progreso al copiar un grupo de archivos, la propiedad Maximum se podría establecer en el número total de archivos que se van a copiar. La propiedad Value representa el progreso que la aplicación realiza para terminar la operación. Como la barra que se muestra en el control es una colección de bloques, el valor que muestra ToolStripProgressBar sólo se aproxima al valor real de la propiedad Value. Según el tamaño del control ToolStripProgressBar, la propiedad Value determina cuándo se debe mostrar el siguiente bloque.

Existen varias maneras de modificar el valor que muestra el control ToolStripProgressBar además de modificar la propiedad Value directamente. Se puede utilizar la propiedad Step para especificar el valor con que se incrementará la propiedad Value y, después, llamar al método PerformStep para incrementar ese valor. Para variar el valor de incremento, puede utilizar el método Increment y especificar el valor por el que se incrementará la propiedad Value.

ToolStripProgressBar reemplaza el anterior control ProgressBar, que no obstante se mantiene para conservar la compatibilidad con versiones anteriores.

Ejemplos

El ejemplo de código siguiente muestra un control ToolStripProgressBar que calcula una secuencia de números de Fibonacci.

Visual Basic
Imports System
Imports System.Collections.Generic
Imports System.Windows.Forms
Imports System.ComponentModel



Class FibonacciNumber
   Inherits Form

   <STAThread()>  _
   Shared Sub Main()
      Application.EnableVisualStyles()
      Application.Run(New FibonacciNumber())
   End Sub    
   Private progressStatusStrip As StatusStrip
   Private toolStripProgressBar As ToolStripProgressBar
   Private requestedCountControl As NumericUpDown
   Private goButton As Button
   Private outputTextBox As TextBox
   Private backgroundWorker As BackgroundWorker
   Private toolStripStatusLabel As ToolStripStatusLabel
   Private requestedCount As Integer


   Public Sub New()
      [Text] = "Fibonacci"

      ' Prepare the StatusStrip.
      progressStatusStrip = New StatusStrip()
      toolStripProgressBar = New ToolStripProgressBar()
      toolStripProgressBar.Enabled = False
      toolStripStatusLabel = New ToolStripStatusLabel()
      progressStatusStrip.Items.Add(toolStripProgressBar)
      progressStatusStrip.Items.Add(toolStripStatusLabel)

      Dim flp As New FlowLayoutPanel()
      flp.Dock = DockStyle.Top

      Dim beforeLabel As New Label()
      beforeLabel.Text = "Calculate the first "
      beforeLabel.AutoSize = True
      flp.Controls.Add(beforeLabel)
      requestedCountControl = New NumericUpDown()
      requestedCountControl.Maximum = 1000
      requestedCountControl.Minimum = 1
      requestedCountControl.Value = 100
      flp.Controls.Add(requestedCountControl)
      Dim afterLabel As New Label()
      afterLabel.Text = "Numbers in the Fibonacci sequence."
      afterLabel.AutoSize = True
      flp.Controls.Add(afterLabel)

      goButton = New Button()
      goButton.Text = "&Go"
      AddHandler goButton.Click, AddressOf button1_Click
      flp.Controls.Add(goButton)

      outputTextBox = New TextBox()
      outputTextBox.Multiline = True
      outputTextBox.ReadOnly = True
      outputTextBox.ScrollBars = ScrollBars.Vertical
      outputTextBox.Dock = DockStyle.Fill

      Controls.Add(outputTextBox)
      Controls.Add(progressStatusStrip)
      Controls.Add(flp)

      backgroundWorker = New BackgroundWorker()
      backgroundWorker.WorkerReportsProgress = True
      AddHandler backgroundWorker.DoWork, AddressOf backgroundWorker1_DoWork
      AddHandler backgroundWorker.RunWorkerCompleted, AddressOf backgroundWorker1_RunWorkerCompleted
      AddHandler backgroundWorker.ProgressChanged, AddressOf backgroundWorker1_ProgressChanged
   End Sub 


   Private Sub backgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
      ' This method will run on a thread other than the UI thread.
      ' Be sure not to manipulate any Windows Forms controls created
      ' on the UI thread from this method.
      backgroundWorker.ReportProgress(0, "Working...")
      Dim lastlast As [Decimal] = 0
      Dim last As [Decimal] = 1
      Dim current As [Decimal]
      If requestedCount >= 1 Then
         AppendNumber(0)
      End If
      If requestedCount >= 2 Then
         AppendNumber(1)
      End If
      Dim i As Integer

      While i < requestedCount
         ' Calculate the number.
         current = lastlast + last
         ' Introduce some delay to simulate a more complicated calculation.
         System.Threading.Thread.Sleep(100)
         AppendNumber(current)
         backgroundWorker.ReportProgress(100 * i / requestedCount, "Working...")
         ' Get ready for the next iteration.
         lastlast = last
         last = current
         i += 1
      End While


      backgroundWorker.ReportProgress(100, "Complete!")
    End Sub


   Delegate Sub AppendNumberDelegate(number As [Decimal])

   Private Sub AppendNumber(number As [Decimal])
      If outputTextBox.InvokeRequired Then
         outputTextBox.Invoke(New AppendNumberDelegate(AddressOf AppendNumber), number)
      Else
         outputTextBox.AppendText((number.ToString("N0") + Environment.NewLine))
      End If
   End Sub 
   Private Sub backgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs)
      toolStripProgressBar.Value = e.ProgressPercentage
      toolStripStatusLabel.Text = e.UserState '
   End Sub 


   Private Sub backgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs)
      If TypeOf e.Error Is OverflowException Then
         outputTextBox.AppendText((Environment.NewLine + "**OVERFLOW ERROR, number is too large to be represented by the decimal data type**"))
      End If
      toolStripProgressBar.Enabled = False
      requestedCountControl.Enabled = True
      goButton.Enabled = True
   End Sub 


   Private Sub button1_Click(sender As Object, e As EventArgs)
      goButton.Enabled = False
      toolStripProgressBar.Enabled = True
      requestedCount = Fix(requestedCountControl.Value)
      requestedCountControl.Enabled = False
      outputTextBox.Clear()
      backgroundWorker.RunWorkerAsync()
   End Sub 
End Class 


C#
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.ComponentModel;

class FibonacciNumber : Form
{
	[STAThread]
	static void Main()
	{
		Application.EnableVisualStyles();
		Application.Run(new FibonacciNumber());
	}

	private StatusStrip progressStatusStrip;
	private ToolStripProgressBar toolStripProgressBar;
	private NumericUpDown requestedCountControl;
	private Button goButton;
	private TextBox outputTextBox;
	private BackgroundWorker backgroundWorker;
	private ToolStripStatusLabel toolStripStatusLabel;
	private int requestedCount;

	public FibonacciNumber()
	{
		Text = "Fibonacci";
		
		// Prepare the StatusStrip.
		progressStatusStrip = new StatusStrip();
		toolStripProgressBar = new ToolStripProgressBar();
		toolStripProgressBar.Enabled = false;
		toolStripStatusLabel = new ToolStripStatusLabel();
		progressStatusStrip.Items.Add(toolStripProgressBar);
		progressStatusStrip.Items.Add(toolStripStatusLabel);

		FlowLayoutPanel flp = new FlowLayoutPanel();
		flp.Dock = DockStyle.Top;

		Label beforeLabel = new Label();
		beforeLabel.Text = "Calculate the first ";
		beforeLabel.AutoSize = true;
		flp.Controls.Add(beforeLabel);
		requestedCountControl = new NumericUpDown();
		requestedCountControl.Maximum = 1000;
		requestedCountControl.Minimum = 1;
		requestedCountControl.Value = 100;
		flp.Controls.Add(requestedCountControl);
		Label afterLabel = new Label();
		afterLabel.Text = "Numbers in the Fibonacci sequence.";
		afterLabel.AutoSize = true;
		flp.Controls.Add(afterLabel);
		
		goButton = new Button();
		goButton.Text = "&Go";
		goButton.Click += new System.EventHandler(button1_Click);
		flp.Controls.Add(goButton);

		outputTextBox = new TextBox();
		outputTextBox.Multiline = true;
		outputTextBox.ReadOnly = true;
		outputTextBox.ScrollBars = ScrollBars.Vertical;
		outputTextBox.Dock = DockStyle.Fill;

		Controls.Add(outputTextBox);
		Controls.Add(progressStatusStrip);
		Controls.Add(flp);

		backgroundWorker = new BackgroundWorker();
		backgroundWorker.WorkerReportsProgress = true;
		backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
		backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
		backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
		
	}

	private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
	{
		// This method will run on a thread other than the UI thread.
		// Be sure not to manipulate any Windows Forms controls created
		// on the UI thread from this method.
		backgroundWorker.ReportProgress(0, "Working...");
		Decimal lastlast = 0;
		Decimal last = 1;
		Decimal current;
		if (requestedCount >= 1)
		{ AppendNumber(0); }
		if (requestedCount >= 2)
		{ AppendNumber(1); }
		for (int i = 2; i < requestedCount; ++i)
		{
			// Calculate the number.
			checked { current = lastlast + last; }
			// Introduce some delay to simulate a more complicated calculation.
			System.Threading.Thread.Sleep(100);
			AppendNumber(current);
			backgroundWorker.ReportProgress((100 * i) / requestedCount, "Working...");
			// Get ready for the next iteration.
			lastlast = last;
			last = current;
		}


		backgroundWorker.ReportProgress(100, "Complete!");
	}

	private delegate void AppendNumberDelegate(Decimal number);
	private void AppendNumber(Decimal number)
	{
		if (outputTextBox.InvokeRequired)
		{ outputTextBox.Invoke(new AppendNumberDelegate(AppendNumber), number); }
		else
		{ outputTextBox.AppendText(number.ToString("N0") + Environment.NewLine); }
	}
	private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
	{
		toolStripProgressBar.Value = e.ProgressPercentage;
		toolStripStatusLabel.Text = e.UserState as String;
	}

	private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
	{
		if (e.Error is OverflowException)
		{ outputTextBox.AppendText(Environment.NewLine + "**OVERFLOW ERROR, number is too large to be represented by the decimal data type**"); }
		toolStripProgressBar.Enabled = false;
		requestedCountControl.Enabled = true;
		goButton.Enabled = true;

	}

	private void button1_Click(object sender, EventArgs e)
	{
		goButton.Enabled = false;
		toolStripProgressBar.Enabled = true;
		requestedCount = (int)requestedCountControl.Value;
		requestedCountControl.Enabled = false;
		outputTextBox.Clear();
		backgroundWorker.RunWorkerAsync();
	}
}


Jerarquía de herencia

System.Object
  System.MarshalByRefObject
    System.ComponentModel.Component
      System.Windows.Forms.ToolStripItem
        System.Windows.Forms.ToolStripControlHost
          System.Windows.Forms.ToolStripProgressBar
Seguridad para subprocesos

Todos los miembros static (Shared en Visual Basic) públicos de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.
Plataformas

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión

.NET Framework

Compatible con: 3.5, 3.0, 2.0
Vea también

Referencia

Otros recursos