Progressbar usando 2 Forms


A medida que un programa crece puede tornarse lento, haciendo procesos y devolviendo los valores que necesitamos duren en cargarse y a veces dañando nuestra interfaz gráfica. Esta vez veremos como usar un backgroundWorker en un formulario Hijo para cargar la progressBar del formulario Padre. Que necesitaremos:

  1. Dos Formularios
  2. Añadir un controles a el Formulario Padre  (progressBar y un Button)
  3. Añadir un control al Formulario Hijo (backgroundWorker)

Form Hijo

Luego de añadir el control backgroundWorker vamos a las Propiedades y cambiamos la opción WorkerReportsProgress de False a True para poder reportar el progreso en la progressBar. Ahora añadimos los 3 eventos del backgroundWorker

private void Hijo_Load ( object sender, EventArgs e )
        {
            backgroundWorker.RunWorkerAsync ();
        }
private void backgroundWorker_DoWork ( object sender, DoWorkEventArgs e )
        {
            for ( int i = 1 ; i <= 100 ; i++ )
            {
                backgroundWorker.ReportProgress ( i );
                Thread.Sleep ( 150 );
            }
        }

Este procedimiento es el que se encargará de hacer el proceso que nosotros queramos llevar acabo.

public event System.ComponentModel.ProgressChangedEventHandler ProgressChanged;
        private void backgroundWorker_ProgressChanged ( object sender, ProgressChangedEventArgs e )
        {
            if ( ProgressChanged != null )
            {
                ProgressChanged ( sender, e );
            }
        }

En este caso cada vez que exista un cambio en el progreso del backgroundWorker el evento ProgressChanged va a ser el que ayudará a realizar el cambio en el Form Padre.

Form Padre

private void ProgressChanged ( object sender, ProgressChangedEventArgs e )
        {
            this.progressBar1.Value = e.ProgressPercentage;
            this.label1.Text = e.ProgressPercentage.ToString() + " %";
        }

Este será el código que  se ejecutará una vez que el Evento ProgressChanged del formulario Hijo se active, como vemos solo es la asignación del valor que teníamos en el For del backgroundWorker_DoWork.

        private void comenzar_Click ( object sender, EventArgs e )
        {
            using ( Hijo form = new Hijo() )
            {
                form.ProgressChanged += new ProgressChangedEventHandler(ProgressChanged);
                form.ShowDialog ();
            }
        }

Este pedazo de código nos muestra lo que sucede al presionar el click para comenzar, se crea un nuevo Form Hijo, se agrega el evento y se muestra la ventana.

Como siempre aquí dejo el proyecto funcionando, recordar que se debe cambiar la extensión de .odt a .zip.

Saludos

Progressbar.zip

Anuncios

2 Respuestas a “Progressbar usando 2 Forms

  1. Hola, y no tendras un ejemplo en el que desde un form1 se ejecute un proceso, y mientras este se ejecute llame a un form2 en donde solo se muestre el progressbar?
    Seria genial si lo tuvieras
    Saludos

  2. por que lo pones Thread.Sleep ( 150 );? eso quiere decdir que no carga de acuerdo a los datos que tiene el formulario?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s