Buen día a todos!! En esta oportunidad se mostrará el uso del BackGroundWorker y Delegados. Su uso es muy importante, debido a que informa al usuario que un proceso se está ejecutando, mostrando ya sea una barra de progreso o imagen gif, eso ya depende del usuario, para este caso colocaremos los 2. Esto informa al usuario que el sistema se está ejecutando y no que se “colgó”. Como sabemos tenemos que ser muy descriptivos con el usuario. Esto principalmente se implementa en carga de datos masiva.
Ahora pasemos a la parte buena, creamos un form como en la siguiente imagen :
Luego crearemos nuestro cuadro de dialogo, para ello crean un form similar a este :
Para la imagen gif pueden descargarla de aquí :Cargando1.gif
Ahora el código del Formulario que solicita los datos para llenar la grilla :
PDT: En la propiedad del ProgressBar colocar en Marquee mediante la vista Diseño.
1: using System;
2: using System.Collections.Generic;
3: using System.ComponentModel;
4: using System.Data;
5: using System.Drawing;
6: using System.Linq;
7: using System.Text;
8: using System.Windows.Forms;
9: 10: namespace WindowsFormsApplication1
11: {12: public partial class Form3 : Form
13: {14: public Form3()
15: { 16: InitializeComponent(); 17: } 18: 19: //Creamos un dataset
20: DataSet ds = new DataSet();
21: 22: public void rssBlog()
23: { 24: //Leeremos el ultimo rss del blog
25: ds.ReadXml("http://feeds.feedburner.com/ProgramacinConEjemplosnet?format=xml", XmlReadMode.Auto);
26: } 27: 28: private void btnCargarDatos_Click(object sender, EventArgs e)
29: {30: //Creamos la instancia del dialogo y pasamos el trabajo
31: frmDialog mensaje = new frmDialog(rssBlog);
32: //Si el trabajo termina OK entonces...
33: if (mensaje.ShowDialog(this) == DialogResult.OK)
34: {35: //Pasamos el resultado obtenido a la grilla
36: dataGridView1.DataSource = ds.Tables[0]; 37: } 38: } 39: } 40: }Luego el código del Formulario Diálogo que ejecuta el trabajo :
1: using System;
2: using System.Collections.Generic;
3: using System.ComponentModel;
4: using System.Data;
5: using System.Drawing;
6: using System.Linq;
7: using System.Text;
8: using System.Windows.Forms;
9: 10: namespace WindowsFormsApplication1
11: {12: public partial class frmDialog : Form
13: { 14: 15: //Declaracion del delegado(declara la firma y el nombre
16: //que se le asignará
17: public delegate void trabajo();
18: 19: //Delegado que usaremos para realizar finalmente el trabajo
20: //entregado por parametro al constructor
21: public trabajo Delegado { get; set; }
22: 23: 24: public frmDialog(trabajo delegado)
25: { 26: InitializeComponent();27: //Recibimos el trabajo
28: this.Delegado = delegado;
29: } 30: 31: private BackgroundWorker nuevoTrabajo(trabajo delegado)
32: {33: //Creo el trabajador
34: var trabajador = new BackgroundWorker();
35: 36: //Hacer el trabajo...
37: trabajador.DoWork += delegate {delegado(); };
38: 39: //Si el trabajo se completa entonces...
40: trabajador.RunWorkerCompleted += delegate {DialogResult = DialogResult.OK; Close(); };
41: 42: return trabajador;
43: 44: } 45: 46: private void Form2_Load(object sender, EventArgs e)
47: {48: //Recibimos el trabajo y ejecutamos
49: nuevoTrabajo(Delegado).RunWorkerAsync(); 50: } 51: } 52: }Cabe recordar que si quieren mandar un dato al formulario Dialogo no lo hagan mediante un control, sino mediante un tipo de dato(string,int32,Double,etc…) ya que sino les saldrá error debido a que se está ejecutando en otro hilo.
Ahora solo queda ejecutar el código y probar! Hasta una nueva oportunidad. Saludos!:arriba:.