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.

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

  1. Zaz!! Ni David Copperfield hubiera desaparecido el VS tan rápido… Y lo mejor es que esto no es un acto de ilusionismo… jejeje
    Ya pude validar por mi mismo el error… jajaja seguiremos reportando sobre esta misteriosa desaparición.

  2. Jerson: ojala y puedan arreglarlo antes del SP1…. aunque igual y nos dicen que sera para luego del sp.. pero si la gente vota en connect, sera mas presion para el TEAM y asi podriamos tener un parche pronto.

    Omar: te falto… mas rapido que politico…, la vdd quisiera ya no tener que toparme con cosas de este tipo, y tener una vida de mucha paz y tranquilidad.

    Salu2

    Ddaz

  3. Quizás el problema se rebaje si detectas en código si estás en modo diseño y actuas en consecuencia.

    Todos los componentes tienen una propiedad que se llama DesingMode que sirve para eso.

  4. Te dejo un Tip

    en los sitios “importantes” y demás de tu User Control, preguntá si estás en modo diseño antes de habilitar que cualquier usuario pueda hacer click en el editor de formularios de Visual Studio.

    El problema está en que si bien, son User Controls, los mismos una vez compilados, están “en ejecución” alojados en el editor de forms, dentro de VS. En otras palabras, si se muere algo, se muere VS.

    La forma de preguntar si estás en modo diseño es

    Private Sub btnCerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCerrar.Click

    ‘ valida si estas en modo design 😀
    If Me.DesignMode Then Return

    Application.Exit()

    End Sub

    Saludos

  5. Hola bruno:

    Hasta eso, si tengo claro, pero no crees que es casi absurdo tener que protegerme “del modo de diseño del mismo IDE”? cuando esto deberia de protegerlo la herramienta en si, el ejemplo del app.exit, es solo un ejemplo, para no tener que poner el codigo que uso en mi app real, pero igual ” lo truena” … segun lo que dices en el 99% de mis UC tendrian que ser validados contra la herramienta ( y solo por eso por que a nivel de ejecucion no fallan).

    MS ya esta revisando el problema, hace un rato actualizaron el track, y pusieron esto:

    Thanks for your feedback. We are escalating this bug to the product unit who works on that specific feature area. The team will review this issue and make a decision on whether they will fix it or not for the next release.

    Thank you,
    Visual Studio Product Team
    Publicado por Microsoft el 07/07/2008 a las 01:29 a.m.

    ahora esperemos que se animen a arreglarlo.

    Salu2

    Ddaz

  6. Hola Bruno, pienso lo mismo, pero considero que el VS no deberia permitir esa funcionalidad, o si? (yo sigo creyendo que es un Bug!)

    Dejarias ese if en el código luego de pasar a producción? Eso es lo que no me gusta de ponerlo.

    Saludos.

  7. Hey David, Jersson, pues la mejor forma de ver esto es adecuándolo al contexto de trabajo.

    1. Tu serás la única persona que consumira esos UC. En este contexto, no agregues ninguna validación, tu ya sabes como funciona y si presionas algún botón, por equivocacion, es momento de tomar una cerveza y de descansar un poco.

    2. Tu creas UC para un equipo de trabajo. Pues en este 2do escenario, debes pensar que estas creando HERRAMIENTAS para tus compañeros, y debes tener en cuenta las diferentes casuísticas, como por ejemplo que alguien que no escuchó tus recomendaciones, haga click en el botón. Deberías controlar todos los estados posibles.

    Personalmente (y repito personalmente :P) yo no lo veo como un BUG. El IDE de Visual Studio, hostea y ejecuta componentes .NET, por lo que “el código que tu escribes, es el que se ejecuta”. Aunque claro, para gustos -> colores 😀

    Saludos

  8. Hola Bruno, esto ya parece un foro!
    bueno, en realidad bug o no, considero que el vs no deberia tener esa funcionalidad de poder “ver” el user control funcionando, en tiempo de diseño.
    recuerdo, que en VB6 no era asi, pero bueno, cuestion de gustos, como dices.

    Un saludo.

  9. Hola A todos
    (si parece un foro esto je)

    1) Tengo VS2008 SP1 (beta1) y a mi no me sucede lo mismo. Descargue el codigo y cuando hago click en el boton en el form no pasa nada 🙂
    pero hice algo peor.. (ver punto 6)

    2) La idea de “visualizar” el componente en tiempo de diseño me parece muy importante (y viene de versionea anteriores con las OCX en vb6)
    Si estamos diseñnado una aplicacion que agrega botones “on-the-fly” y decimos que genere 5 en vertical seria conveniente VER/VISUALIZAR esos 5 botones… o sea se debe EJECUTAR el metodo que genera estos botones y entonces tendremos forma de diseñar (acordarse de WYGWYS). ESTO SUCEDE con cualquier control que utilicemos.. en una GRILLA (web o win) acaso no visualizamos las columnas cada vez que agregamos..? estos nos ayuda muchisimo (y asi muchos ejemplos)

    3) Por esa razon no creo que sea un bug, por eso existe DesignMode, para indicarle que “porciones” de codigo no quiero que se ejecuten en el modo diseño.

    4) Ahora bien existe Si un BUG que lo sufri… que es con la propiedad DesignMode en UserControl Anidados. Aqui el ultimo UC tiene DesignMode en false.
    http://support.microsoft.com/kb/839202/es

    5) Haciendo memoria…en VB6 cuando creamos componentes OCX (lo que aqui son UserControl… en general) teniamos que cerrar el formulario de diseño del OCX para VISUALIZARLo en el formulario donde lo teniamos incrustado (o sino la zona estaba con una linias en diagonal)… Cuando cerrabamos el modo diseño dle OCX efectivamente ralizaba todo el proceso como si estuviera en ejeccion, realmente se ejectutaba el control en “modo de diseño”, lo que necesistabamos por ejemplo para JUSTIFICAR controles (ahora tenemos la propiedad anchor)

    6) Un bug (el mismo que el punto 3)
    Realizar bajo el mismo proyecto un nuevo UC
    –Form1
    —-ucBotonCerrar
    ——–ucBotonDemo
    Aqui tenemos la anidacion, en el ultimo UC un solo boton con el codigo:
    Private Sub ucBotonDemo_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Me.DesignMode Then
    Application.Exit()
    End If
    End Sub

    Cuando volvemos al formulario… ADIOS IDE. Se nos cierra el VS2008

    Aqui dejo para la descarga
    (tal vez hoy me haga un tiempo y postee algo al respecto)
    http://cid-f5a5b07c2286412f.skydrive.live.com/self.aspx/Geeks.ms/winPruebaUserControlsANIDADOS%7C_byJoseFernandez.zip

    Saludos..
    Jose A. Fernandez

  10. Hola 🙂

    si ya parece foro !

    bueno jose, en si no me parece malo que muestre los controles, es mas me fascino el echo de poder presionar los botones .. estuve tentado ha hacer un post de eso… pero ps no…
    yo lo tomo como bug.. no por que pueda cerrar el vs con un application.exit… sino por que se me cerro en medio de un trabajo, donde no habia ningun problema de codigo… era un componente funcional…

    jalaba datos de otro componente :)..

    esta muy bien que muestre los controles, pero esta mal a mi parecer, o como diria jersson o bruno ” de mi color..” … ( CREMA POR CIERTO! .. la U campeono!!). que no tenga un buen manejo de excepciones y sea tan facil volarse la herramienta.
    algo que me preocupa es que esto pudiera usarse como forma de ataque….( mejor ya no digo mas de eso.. sino… ).

    No quisiera que quiten esa funcionalidad, pero si que la reparen… que bueno que en el Beta del VS ya no te sale, lamentablemente desde que tome la desicion de usar software en mi idioma natal… eso me alejo mmucho de los betas..ya que todo sale en ingles….., logiccamente muchos se mofan de mi cuando ven en mi pc todo en espaniol… jeje bueno ya me estoy saliendo de nuevo de foco. espero se entienda mi punto.. en este foro jeje 🙂

    Salu2

    Ddaz

  11. Es correcto lo que comentas aunque creo que depende del punto de vista. Si vas a distribuir tu control lo correcto es detectar si estas en modo de Diseño o Ejecución. De hecho esta es una premisa en el desarrollo de controles.

    Ahora bien, es cierto que MS debería dar opción de activar o desactivar este comportamiento pero lo cierto es que lo hicieron al implementar la propiedad DesignMode.

    De cualquier forma, te has topado con un “detalle” que podría resultar bastante controversial.

Responder a elbruno Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *