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:.