Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: d91 en 8 Enero 2016, 14:28 pm



Título: manejo de controles en los hilos background worker
Publicado por: d91 en 8 Enero 2016, 14:28 pm
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
  1. private void btncodigo_Click(object sender, EventArgs e)
  2.        {
  3.            if (backgroundWorker1.IsBusy != true)
  4.            {
  5.                this.pictureBox1.Visible = true;
  6.                this.btncodigo.Enabled = false;
  7.                backgroundWorker1.RunWorkerAsync();
  8.            }
  9.            //generarNuevoCodigo();
  10.        }
  11.  
  12.        void generarNuevoCodigo() {
  13.            manzanaDA codigo = new manzanaDA();
  14.            DataTable dt;
  15.            try
  16.            {
  17.               // btncodigo.Visible = false;
  18.                //pictureBox1.Visible = true;
  19.                dt = codigo.cargar("sp_codigo_manzana").Tables[0];
  20.                Codigos nuevo = new Codigos();
  21.                txtid.Text = nuevo.generaCodigo(dt);  //aqui me da la excepcion
  22.  
  23.            }//try
  24.            catch (Exception ex)
  25.            {
  26.                //throw new Exception("Error " + ex.Message);
  27.            }//catch
  28.            finally {
  29.               // pictureBox1.Visible = false;
  30.                //btncodigo.Visible = true;
  31.            }//finally
  32.  
  33.        }
  34.  
  35.        private void txtdescrip_KeyPress(object sender, KeyPressEventArgs e)
  36.        {
  37.            if (e.KeyChar == Convert.ToChar(Keys.Enter)) {
  38.                btnguardar.Select();
  39.                btnguardar.Focus();
  40.            }
  41.        }
  42.  
  43.        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  44.        {
  45.            generarNuevoCodigo();
  46.        }
  47.  
  48.        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  49.        {
  50.            if (e.Cancelled == true)
  51.            {
  52.                this.btncodigo.Enabled = true;
  53.                this.pictureBox1.Visible = false;
  54.            }
  55.            else if (e.Error != null)
  56.            {
  57.                this.btncodigo.Enabled = true;
  58.                this.pictureBox1.Visible = false;
  59.            }
  60.            else
  61.            {
  62.                this.btncodigo.Enabled = true;
  63.                this.pictureBox1.Visible = false;
  64.            }
  65.        }//void generar nuevo codigo
  66.  

todos los controles los creo en tiempo de diseño y no se como manejarlos haciendo nuevos hilos durante la ejecucion


Título: Re: manejo de controles en los hilos background worker
Publicado por: Eleкtro en 8 Enero 2016, 15:43 pm
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
  1. 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!