hola, en una entrada anterior de como hacer funcionar un gif en un picture box necesitaba hacer funcionar un gif al hacer una consulta, despues de buscar un poco mas me encontre con el background worker, entonces ahora realizo la consulta, se muestra el gif pero la consulta me debe llenar un textbox (la consulta se realiza bien), pero al acceder a este textbox me da el error de ("Se intento tener acceso al control txtid desde un subproceso distinto al que lo creó")
private void btncodigo_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
this.pictureBox1.Visible = true;
this.btncodigo.Enabled = false;
backgroundWorker1.RunWorkerAsync();
}
//generarNuevoCodigo();
}
void generarNuevoCodigo() {
manzanaDA codigo = new manzanaDA();
DataTable dt;
try
{
// btncodigo.Visible = false;
//pictureBox1.Visible = true;
dt = codigo.cargar("sp_codigo_manzana").Tables[0];
Codigos nuevo = new Codigos();
txtid.Text = nuevo.generaCodigo(dt); //aqui me da la excepcion
}//try
catch (Exception ex)
{
//throw new Exception("Error " + ex.Message);
}//catch
finally {
// pictureBox1.Visible = false;
//btncodigo.Visible = true;
}//finally
}
private void txtdescrip_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == Convert.ToChar(Keys.Enter)) {
btnguardar.Select();
btnguardar.Focus();
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
generarNuevoCodigo();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
this.btncodigo.Enabled = true;
this.pictureBox1.Visible = false;
}
else if (e.Error != null)
{
this.btncodigo.Enabled = true;
this.pictureBox1.Visible = false;
}
else
{
this.btncodigo.Enabled = true;
this.pictureBox1.Visible = false;
}
}//void generar nuevo codigo
todos los controles los creo en tiempo de diseño y no se como manejarlos haciendo nuevos hilos durante la ejecucion
Tienes que modificar el estado del control desde el mismo hilo (UI-thread) donde lo creaste, para ello puedes utilizar el método Control.Invoke (o Control.BeginInvoke si prefieres el asincronismo):
txtid.Invoke(new Action(() => txtid.Text = nuevo.generaCodigo(dt)));
Deberías leer un poco más sobre hilos y delegados, busca ejemplos, guias, tutoriales o consejos en Google (MSDN, CodeProject, etc),
así conseguirías evitar los errores más comunes y principiantes (que todos hemos sufrido) como este.
Saludos!