Principales respuestas
Creación de controles en tiempo de ejecución con evento click.

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)
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- Propuesto como respuesta Pablo RubioModerator viernes, 8 de diciembre de 2017 15:49
- Marcado como respuesta Pablo RubioModerator jueves, 14 de diciembre de 2017 15:37
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- Propuesto como respuesta Pablo RubioModerator viernes, 8 de diciembre de 2017 15:49
- Marcado como respuesta Pablo RubioModerator jueves, 14 de diciembre de 2017 15:37
-
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)
-
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.
-
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:
- Propuesto como respuesta Pablo RubioModerator viernes, 8 de diciembre de 2017 15:49
-
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)