manejo de controles en los hilos background worker

Iniciado por d91, 8 Enero 2016, 14:28 PM

0 Miembros y 1 Visitante están viendo este tema.

d91

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ó")
Código (csharp) [Seleccionar]

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

Eleкtro

#1
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):
Código (csharp) [Seleccionar]
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!