Detectar código que se ejecuta en tiempo de diseño

20/12/2005 - 16:30 por Benton | Informe spam
Hola,

He creado una clase componente que pongo en la barra de herramientas y de
ahí lo agrego a un formulario. En ese momento, parece como si el diseñador
creara una instancia, pues el código del constructor se ejecuta.

Pues bien, quisiera saber si es posible evitar que el diseñador haga esto, o
si dentro de la clase es posible detectar esta situación. Esto porque mi
clase hace uso de un provider de ADO.NET 2.0 que solo se carga en el tiempo
de ejecución de la aplicación.

Saludos,

-Benton

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
20/12/2005 - 20:57 | Informe spam
Benton,

Prueba usando la propiedad DesignMode del componente en el constructor:

http://msdn2.microsoft.com/en-us/li...nmode.aspx

Slds - Octavio

"Benton" escribió en el mensaje
news:%
Hola,

He creado una clase componente que pongo en la barra de herramientas y de
ahí lo agrego a un formulario. En ese momento, parece como si el diseñador
creara una instancia, pues el código del constructor se ejecuta.

Pues bien, quisiera saber si es posible evitar que el diseñador haga esto,
o si dentro de la clase es posible detectar esta situación. Esto porque mi
clase hace uso de un provider de ADO.NET 2.0 que solo se carga en el
tiempo de ejecución de la aplicación.

Saludos,

-Benton

Respuesta Responder a este mensaje
#2 Benton
20/12/2005 - 22:21 | Informe spam
Gracias Octavio.

Este era mi código original dentro del constructor (fragmento):

mProvider = "FirebirdSql.Data.FirebirdClient";
mFactory = DbProviderFactories.GetFactory(mProvider);

y en la segunda línea se producía la excepción. Cambié el código por éste:

if (!this.Site.DesignMode)
{
mProvider = "FirebirdSql.Data.FirebirdClient";
mFactory = DbProviderFactories.GetFactory(mProvider);
}

y ahora la excepción es en línea del if. Ni siquiera entra al bloque entre
llaves. Incluso, aunque remueva las dos líneas en el bloque y éste quede
vacío, la excepción se sigue produciendo en la línea del if.

Veré qué más puedo hacer.

Saludos,

-Benton

Prueba usando la propiedad DesignMode del componente en el constructor:

http://msdn2.microsoft.com/en-us/li...nmode.aspx

Slds - Octavio
Respuesta Responder a este mensaje
#3 Benton
20/12/2005 - 22:29 | Informe spam
Corrijo y aclaro. La excepción es otra, simplemente es una excepción al
tratar de accesar la propiedad DesignMode, ya que el objeto que la contiene
(ISite) es null.

La ayuda dice que la propiedad nos dará true o false dependiento de si el
componente está en modo de diseño o no. Lo paradójico es que la propiedad no
puede accesarse en modo de diseño. :-(

O tal vez se refiere a que el componente esté siendo diseñado visualmente,
en algunos de los diseñadores para custom controls.

Saludos,

-Benton
Respuesta Responder a este mensaje
#4 Eduardo A. Morcillo [MS MVP VB]
22/12/2005 - 05:43 | Informe spam
El problema es que estas en el constructor de la clase. Cuando se ejecuta el
constructor el objeto no esta todavia disponible para el codigo fuera de
este y por lo tanto el diseñador no tiene forma de establecer la propiedad
Site sino hasta que finalice el constructor y pueda acceder a la instancia.
Una forma de detectar si esta en el diseñador o no desde el constructor es
crear un constructor que tomo como parametro un IContainer. El diseñador
usara el constructor sin parametros para crear la instancia que muestra,
pero usara el otro constructor para generar el codigo del formulario.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida