¿Por qué label2.Text en Form1 no se actualiza desde la nueva clase?

En Form1 tengo label2 en el diseñador y agregué un código:

public void lbl2(string text)
        {
            label2.Text = text;
        }

En la parte superior de la nueva clase, agregué:

private static AnimationEditor.Form1 fr1 = new AnimationEditor.Form1();

Y en el nuevo evento de clase estoy actualizando la etiqueta2. Texto así:

int ISampleGrabberCB.BufferCB(double sampleTime, IntPtr pBuffer, int bufferLen)
        {
            using (var bitmap = new Bitmap(_width, _height, _width * 3, PixelFormat.Format24bppRgb, pBuffer))
            {
                bitmap.RotateFlip(RotateFlipType.Rotate180FlipX);
                if (SaveToDisc)
                {
                    String tempFile = _outFolder + _frameId + ".bmp";
                    if (File.Exists(tempFile))
                    {
                        fr1.lbl2(_frameId.ToString();
                    }
                    else
                    {
                        bitmap.Save(Path.Combine(_outFolder, _frameId + ".bmp"));
                    }
                    _frameId++;
                }
                else
                {
                    if (Images == null)
                        Images = new List<Bitmap>();
                    Images.Add((Bitmap)bitmap.Clone());
                }
            }
            return 0;
        }

La línea que está haciendo la actualización es:

fr1.lbl2(_frameId.ToString();

Ahora usé el punto de interrupción en esta línea en la nueva clase y también en Form1 en label2.Text en la función pública y vi que el texto de label2 cambia primero a 0, luego a 1, luego a 2 y así sucesivamente.

Pero, de hecho, en tiempo real, cuando estoy ejecutando la aplicación, label2 no cambia todo el tiempo, el texto permanece como label2

Este es el evento de clic del botón Form1 cuando hago clic en él, está haciendo el nuevo código de clase:

private void button5_Click(object sender, EventArgs e)
        {
            wmv = new Polkan.DataSource.WmvAdapter(@"d:\VIDEO0040.3gp", sf);
            wmv.SaveToDisc = true;
            wmv.Start();
            wmv.WaitUntilDone();
        }

preguntado el 12 de junio de 12 a las 22:06

¿Qué quiere decir que la interfaz de usuario está bloqueada? No, en Form1 estoy actualizando otras etiquetas como en el evento de movimiento del mouse picturebox1, actualizo en una etiqueta1 las coordenadas del movimiento del mouse y su funcionamiento. También probé en el código de tiempo de ejecución para cambiar el texto label2 a "hola" para probar y funcionó. Así que algo está gastando aquí algo más. -

No fr1 ¿Necesita ser la referencia real al formulario que está utilizando? veo fr1 = new AnimationEditor.Form1();, que probablemente no sea la misma instancia del formulario que está utilizando. -

LarsTech AnimationEditor es el espacio de nombres. Y usé un punto de interrupción en la línea label2.Text = text; en la función lbl2 en Form1 y vi que el texto ha cambiado. El texto variable está cambiando 0,1,2.... -

Seguro que funciona. Sin embargo, parece que tiene dos formularios: uno que está usando y el que creó su clase. Cosas diferentes. -

LarsTech también usé un punto de interrupción ahora en la función label2.Text = text in Form1 lbl2 y vi que también el texto está cambiando y también label2.Text está cambiando una vez que es 0 luego 1 luego 2 ... y así sucesivamente ... mmmm -

1 Respuestas

Creo que la respuesta rápida es pasar la referencia de la etiqueta a la clase:

private Label lbl;

public WmvAdapter(string file, string outFolder, Label label) {
  // yada-yada-yada
  lbl = label;
}

Su rutina cambiaría a:

if (File.Exists(tempFile))
{
  lbl.Text = _frameId.ToString();
}

Su evento de clic:

private void button5_Click(object sender, EventArgs e)
{
  wmv = new Polkan.DataSource.WmvAdapter(@"d:\VIDEO0040.3gp", sf, this.Label2);
  wmv.SaveToDisc = true;
  wmv.Start();
  wmv.WaitUntilDone();
}

La respuesta más larga es hacer que su clase genere un evento y que su formulario lo escuche.

Hacer que su clase conozca el formulario no es la mejor práctica de codificación.

Respondido el 12 de junio de 12 a las 23:06

Lars pero en la nueva clase no puedo hacer privado Form1 fr1; no me da la opcion. Como Form1 dosent existen. - user1434011

Edité y puse mi código Form1 al comienzo del código Form1 en mi publicación de preguntas. - user1434011

@ user1434011 Actualice la respuesta para simplemente pasar la etiqueta en lugar del formulario. - LarsTech

Lars probé tu último código editado y en la nueva clase en la línea lbl.Text = _frameId.ToString(); Obtengo una excepción: la operación de subprocesos cruzados no es válida: se accedió al control 'label2' desde un subproceso que no sea el subproceso en el que se creó. - user1434011

Laboral ! Tuve que invocar lbl en la nueva clase así: if (lbl.InvokeRequired) { lbl.Invoke(new MethodInvoker(delegate { lbl.Text = _frameId.ToString(); })); } - user1434011

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.