Pato Aventura: Dacito Vs V.S. 2008 ….El Problema de Ejecución de código en UserControl, en tiempo de diseño

 

Hola :

 

Cuenta la Leyenda,  que había una vez.. un  Dacito muy travieso, un día este se encontraba jugando en el VS 2008 ( no le puedo llamar trabajo.. por que me divertía programando.. je ), estaba generando una Aplicación Windows, tenia que hacer un generador de horarios, y por usabilidad, esto tenia que ser lo mas gráfico posible, así que decidió usar botones…, pero como este formato se repetiría varias veces… decidió a su vez hacer un UserControl, y allí poner los botones, por cuestión de orden y estética, decidió agregar un TableLayoutPanel, y allí agregar los botones.. pero como Dacito era muy pero muy Vago.. pensó que seria interesante crear los Botones Dinámicamente, así en el proceso podría asignar todos los botones a un mismo manejador de eventos, así todos los eventos ” clic” son enviados a un único lugar… y allí se hacia el discriminante… En tiempo de diseño el UC se vería mas o menos de este modo….

 

 

Luego Adjunto el UserControl a un formulario Windows común y silvestre…. , grata fue la sorpresa, al darse cuenta de que el UC dentro del formulario Windows se renderizaba completo, es decir ya generaba los botones  Y NO SOLO ESO!! los botones  se sombrean al pasar el mouse encima y también podían ser presionados… casi casi como si se estuviera ejecutando el control.

 

 

Hasta allí todo iba de maravilla, pero había que agregarle funcionalidad al UC, así que se decidió, que al ser presionado cualquier botón, hacia unas consultas a una DB, estas estaban  ubicadas en un componente ( dll), se hizo esto…

 

Pero entonces tuvo que pasar lo inevitable…, en una de esas sin querer.. por un azar del destino… a Dacito se le disparo sin querer un clic! encima de uno de los botones creados dinámicamente…, la aplicación mostró un gran ” Visual Studio encontró un problema y debe cerrarse”  Dacito quedo pasmado…, mas aun cuando al reiniciar el visual Studio hubo un problema con el formulario y ya marcaba errores … ( cuando no se había movido líneas de código)….

 

Hubo aun mas problemas, cuando se le ocurrió agregar al UserControl un combo, que ejecute acciones al cambiar el elemento seleccionado ( supuestamente al querer cambiar de selección aparece una ventana de dialogo preguntando si estamos seguros… )… lo que genero que cada vez que quería abrir el formulario en tiempo de diseño…( no ejecutarlo..) saliera esta ventana de dialogo… y de vez en cuando salía un error de la nada que no se corregía hasta que se reiniciaba el Visual Studio; dacito se desespero al grado de dejar de programar….

en eso entro en escena Jersson, y entre platica y platica Dacito le contó el lío que tenia, y Jersson como buen incrédulo ( hasta ver pruebas), pidió imágenes, las cuales les fueron proporcionadas y además de eso también una explicación de como se podría  repetir el bug….

Jersson Prendió la VPC  ( la cual debería de cambiar por vmware), y en un primer momento agrego un botón ( desde el toolbox) al UserControl… de este modo desde el formulario… el botón no podía ser ” presionado” en tiempo de diseño, y por ende tampoco se reproducía el error, así que luego se repitió los pasos iniciales… con la diferencia que en el evento clic del botón el agrego “Application.Exit()”  … con esto, en teoría la aplicación debería cerrarse al ser presionado el botón mientras es ejecutado. de nuevo nos vamos al modo de diseño del formulario…. presionamos un botón ( ojo que la aplicación no esta corriendo.. estamos en modo de diseño ), y entonces ..  por la obra y gracia del espíritu santo ( sin afán de blasfemar) El Visual Studio se cierra lógicamente, sin preguntar ni nada.

El código del UC de prueba,  es el siguiente:

 

   1: Public Class ucBotonCerrar
   2:  
   3:     Private Sub btnCerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCerrar.Click
   4:         Application.Exit()
   5:     End Sub
   6:  
   7:     Private Sub ucBotonCerrar_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   8:  
   9:         CrearBotones()
  10:     End Sub
  11:  
  12:  
  13:     Sub CrearBotones()
  14:         Dim miboton As Button
  15:         For Y As Integer = 1 To 5
  16:             For X As Integer = 1 To 14
  17:                 miboton = New Button
  18:                 With miboton
  19:                     .Name = "B" & X & Y
  20:                     .Text = ""
  21:                     .Height = 70
  22:                     .Width = 70
  23:                     .ForeColor = Color.Red
  24:                 End With
  25:                 AddHandler miboton.Click, AddressOf EventoBotonPresionado
  26:                 tabla.Controls.Add(miboton, Y, X)
  27:             Next
  28:         Next
  29:     End Sub
  30:  
  31:     Public Sub EventoBotonPresionado(ByVal sender As System.Object, ByVal e As System.EventArgs)
  32:         Application.Exit()
  33:  
  34:     End Sub
  35:  
  36: End Class

como verán, no tiene gran ciencia , agregamos a un tablelayoutpanel (tabla) el control…

Luego de un análisis, Jersson me comento que el lío estaba en la tabla…

“Al Parecer El problema se da cuando Agregamos dinámicamente Controles dentro de una tabla (TablelayoutPanel), esto un User Control, ya que al ser renderizado en el formulario que contiene el UC puede ejecutar código en tiempo de diseño, y algunas veces hacer que falle el Visual Studio”

se les antoja probar este “detallito” ? , si quieren bajar el proyecto demo y probarlo ustedes mismos, el código se encuentra aquí, ese es el proyecto que hizo inicialmente Jersson para hacer pruebas :

 

si es que logran reproducir el error, agradecería que ingresen a esta pagina:

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=355116 , y validen el error, para que así los del TEAM de VS se animen a corregir el bug pronto.

 

bueno continuando con la historia, luego le conté de esto a Enrique, Tron.Bas ( David Garza) , Ziquilla y a Nazul,  pudieron replicarlo, además de hacerme el favor de validar el bug en Connect…. de nuevo.. si tu también lo puedes reproducir, agradecería valides del bug.

 

Si se fijan .. no especifique ..” que problemas extra” podría traer este tipo de situación…. esto se lo dejo a su imaginación… ( no quiero tener que volver a quitar un post)

 

Ojalá y el parche para esto salga antes del SP1 o 2  ( si ya se … de nuevo con sueños guajiros )..  además no termine el cuento.. ya que hoy recién envié el evento a Connect, y estoy a la espera de respuesta de MS, ojalá y no me digan que es algo ” por diseño”

 

Hasta la Próxima.

 

El Dacito.

🙂 Publicacion cruzada desde Geeks.ms 🙂 http://geeks.ms/blogs/ddaz

Leave a Reply

Your email address will not be published. Required fields are marked *