none
Creación de controles en tiempo de ejecución con evento click. RRS feed

  • Pregunta

  • Hola a todos.

    El siguiente código me crea una relación de controles,  8 etiquetas, en tiempo de ejecución cada vez que lo invoco. De promedio puedo llamarlo en un mismo proceso unas 15 veces, por lo que me crea 120 nuevas etiquetas. Todo se ejecuta perfectamente y lo mas importante, rápido. El problema viene cuando le incluyo el manejador de evento click. Es el único que necesito pero esto me ralentiza bastante. 

    Como podréis observar, al final del bloque for(int i=0,...) uso el evento Application.DoEvents() y parece que con esto va un poco mas rápido, pero aún no es de mi agrado.

    Se podría hacer de otra forma que fuese más rápido?.

    Muchas gracias.

    private List<Label> GetLineaDetalleMaestra(int linea)
            {
                List<Label> listaControles = new List<Label>() { new Label(), new Label(), new Label(), new Label(), new Label(), new Label(), new Label(), new Label(), new Label() };
                
                /// <summary>
                /// Contiene un array con todas las descripciones de los nombres que llevarán las nuevas etiquetas.
                /// </summary>
                string[] elementos = Enum.GetNames(typeof(PanelDetalleTicket.EnuLineaDetalleTicke));
    
                //Calcula la posición Y de la location del control según la línea.
                int positionYControles = linea - 1;
    
                for (int i = 0; i < elementos.Length; i++)
                {                                
                    listaControles[i].AutoSize = false;
                    listaControles[i].Name = elementos[i] + linea;
                    listaControles[i].BackColor = _BackColor;
                    listaControles[i].BorderStyle = _BorderStyle;
                    listaControles[i].Font = _Font;
                    listaControles[i].Click += new EventHandler(Label_Click);
                    switch (i)
                    {
                        case 3: //Articulo
                            listaControles[i].Size = new Size(180, _AltoControles);
                            listaControles[i].Location = new Point(41, _AltoControles * positionYControles);
                            listaControles[i].TextAlign = ContentAlignment.MiddleLeft;
                            listaControles[i].Visible = true;                        
                            break;
                        case 4: //Observaciones
                            listaControles[i].Size = new Size(180, _AltoControles);
                            listaControles[i].Location = new Point(221, _AltoControles * positionYControles);
                            listaControles[i].TextAlign = ContentAlignment.MiddleLeft;
                            listaControles[i].Visible = true;                        
                            break;
                        case 5: //Cantidad
                            listaControles[i].Size = new Size(41, _AltoControles);
                            listaControles[i].Location = new Point(0, _AltoControles * positionYControles);
                            listaControles[i].TextAlign = ContentAlignment.MiddleRight;
                            listaControles[i].Visible = true;                        
                            break;
                        case 6: //PVP, precio unitario.
                            listaControles[i].Size = new Size(60, _AltoControles);
                            listaControles[i].Location = new Point(401, _AltoControles * positionYControles);
                            listaControles[i].TextAlign = ContentAlignment.MiddleRight;
                            listaControles[i].Visible = true;                        
                            break;
                        case 7: //Total
                            listaControles[i].Size = new Size(60, _AltoControles);
                            listaControles[i].Location = new Point(461, _AltoControles * positionYControles);
                            listaControles[i].TextAlign = ContentAlignment.MiddleRight;
                            listaControles[i].Visible = true;                        
                            break;
                        default:
                            listaControles[i].Visible = false;
                            break;
                    }
    
                    Application.DoEvents();
                }
                
                return listaControles;
            }




    No aprendemos gracias a la escuela sino gracias a los foros ;-) (la original es de Séneca y en lugar de foros es vida)

    martes, 5 de diciembre de 2017 20:56

Respuestas

  • hola

    que es esta linea

    List<Label>listaControles = new List<Label>() { new Label(), new Label(), new Label() ....

    eso es incorrecto, se supones que los label los debes ir instranciando y agregando a la lista de forma dinamica, no se hace esto que aplicas

    la estructura del codigo deberia ser algo como esto

    List<Label> listaControles = new List<Label>()
    
    for (int i = 0; i < elementos.Length; i++)
    {      
    	Label lbl = new Label();
    	lbl.AutoSize = false;
    	lbl.Name = elementos[i] + linea;
    	lbl.BackColor = _BackColor;
    	
    	//resto codigo
    	
    	listaControles.Add(lbl);
    }      
    

    en cada iteracion instancias un label y lo agregas al final la lista

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 5 de diciembre de 2017 21:02

Todas las respuestas

  • hola

    que es esta linea

    List<Label>listaControles = new List<Label>() { new Label(), new Label(), new Label() ....

    eso es incorrecto, se supones que los label los debes ir instranciando y agregando a la lista de forma dinamica, no se hace esto que aplicas

    la estructura del codigo deberia ser algo como esto

    List<Label> listaControles = new List<Label>()
    
    for (int i = 0; i < elementos.Length; i++)
    {      
    	Label lbl = new Label();
    	lbl.AutoSize = false;
    	lbl.Name = elementos[i] + linea;
    	lbl.BackColor = _BackColor;
    	
    	//resto codigo
    	
    	listaControles.Add(lbl);
    }      
    

    en cada iteracion instancias un label y lo agregas al final la lista

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 5 de diciembre de 2017 21:02
  • Hola Leandro.

    Inicialmente lo hice así y lo he dejado, es verdad que el código queda más claro y mas correcto hacerlo como tu dices, pero la lentitud sigue igual. Si bien parece que va más rápido la carga ahora de la forma que me has dicho, en cuanto le añado el manejador del evento click (lbl.Click += new EventHandler(Label_Click);) se ralentizan al ir mostrándose en pantalla de una forma considerable. 


    No aprendemos gracias a la escuela sino gracias a los foros ;-) (la original es de Séneca y en lugar de foros es vida)

    martes, 5 de diciembre de 2017 21:47
  • Hola ravipe

    Para que las soluciones brindadas por los colaboradores puedan ser útiles para el resto de la comunidad, favor de marcarlas.

    Saludos Cordiales.

    Gracias por usar los foros de MSDN.

    Pablo Rubio
     _____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    jueves, 7 de diciembre de 2017 19:31
    Moderador
  • Buenas,

    Adicionalmente a lo que te dice Leandro, que es la mejor opción ya que lo suyo es declarar, instancia, así ganar a lista, tienes la opción de meter algún application.DoEvents por ahí, por ejemplo, antes y después del manejado de eventos si es eso lo que consideras que lo ralentiza. 

    Application.DoEvents lo que hace es dar el hilo al formulario para ejecutar los eventos, si le llamas más veces en tu código, no pasa nada, tardarás in poco más, pero el programa no se congelará. 

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    viernes, 8 de diciembre de 2017 8:07
  • Buenos días.

    Pablo suelo marcar las respuestas cuando resuelven el problema.  En este caso, aunque el código de Leandro me gusta mas que el que yo hice, la lentitud del proceso cuando incluyo los manejadores de eventos click sigue igual.

    Entiendo que no puedo marcar la respuesta como válida. Aún así no se si tendría que realizar alguna otra marca o acción. Dada la importancia que tienen para mi estos foros no me gustaría hacer las cosas de forma errónea e intento ser del todo disciplinado.

    Y por supuesto nunca me canso de agradecer la labor que aquí realizáis.

    Saludos


    No aprendemos gracias a la escuela sino gracias a los foros ;-) (la original es de Séneca y en lugar de foros es vida)

    lunes, 11 de diciembre de 2017 6:34