Escenario y fundamentos teóricos
Tenemos un formulario con un elemento de la Interfaz de Usuario (UI) al que necesita acceder un hilo que está haciendo un procesado de datos.
El hilo no debe acceder directamente al control de la Interfaz de Usuario, sino que debe hacerlo de la forma que vamos a comentar.
Ejemplo de código
En nuestro ejemplo, lo que vamos a modificar es el enlace a datos de un DataGridView
accediendo a su propiedad DataSource
.
Para ser más gráficos, vamos a mostraros el código incorrecto, del acceso directo al control:
//Código 1
dvEjemplo = dsEjemplo.Tables[0].DefaultView;
dataGridViewEjemplo.DataSource = dvEjemplo;
dvEjemplo = dsEjemplo.Tables[0].DefaultView;
dataGridViewEjemplo.DataSource = dvEjemplo;
Ahora veamos el código que deberíamos haber utilizado.
//Código 2
dvEjemplo = dsEjemplo.Tables[0].DefaultView;
this.Invoke((MethodInvoker)delegate
{
dataGridViewEjemplo.DataSource = dvEjemplo; //Acceso seguro a la UI
});
dvEjemplo = dsEjemplo.Tables[0].DefaultView;
this.Invoke((MethodInvoker)delegate
{
dataGridViewEjemplo.DataSource = dvEjemplo; //Acceso seguro a la UI
});
En este ejemplo, el fallo que se estaba generando con el Código 1, es que el ScrollBar
vertical dejaba de funcionar y se veía transparente.