Formularios Dinamicos

10/08/2004 - 22:11 por Pol | Informe spam
hola.

quisiera saber si se puede crear un formulario
dinamicamente en .net, pero pasandole el nombre en una
variable, me explico:

cuando uno crea un formulario MDI utiliza la instruccion:

Dim FormularioHijo As New forma

donde forma es un formulario de la aplicacion.

pero lo que yo necesito es:

Dim nombre="nombre formulario"

y luego crear el formulario como sigue:

Dim FormularioHijo As New nombre.

ejm:

Dim Nombre= "Forma"
Dim FormularioHijo As New nombre

Preguntas similare

Leer las respuestas

#1 Tristan
10/08/2004 - 23:03 | Informe spam
Bueno, hay muchas, muchas formas de hacerlo:

Si el formulario se encuentra en el ensamblado actual, una de ellas sería
asi:

Dim nombre As String = "nombre completo clase"
Dim ensamblado As [Assembly] = [Assembly].GetExecutingAssembly()
Dim f As Form = ensamblado.CreateInstance(nombre) 'Mejor DirectCast...

Donde nombre completo es EspacioDeNombre.Formulario

Otra solución es:

Dim tipo As Type = Type.GetType(nombre)
Dim f As Form = Activator.CreateInstance(tipo)


Por otro lado, si necesitas acceder a miembros específicos del Form, hay
varias formas:

La más simple Late Binding

En lugar de Form utiliza Object:

Dim f As Object = Activator.CreateInstance(tipo)
f.MiembroEspecífico


Pero sin duda lo idea es que utilices polimorfismo. Crea una clase base o
interface de la que hereden todos tus Form, y que contenga los miembros que
necesitas llamar. Utiliza ese tipo en lugar de Object o Form.

Dim f as FormBase = Activator.CreateInstance(tipo)
f.MiembroEspecífico()


Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#2 Pol
11/08/2004 - 19:50 | Informe spam
Buenas, he leido tu respuesta en el foro de Microsoft, y
me parece super completa, pero sigo con mis dudas.
Si no es molestia, te explico mi caso... Tengo una
aplicacion que deseo que cree formularios dinamicos (que
no existen en la aplicacion) en momento de ejecucion. Esto
es asi porque todos esos formularios tienen los mismos
campos. Desearia recojer el nombre del formulario de un
campo de la BD...
Recojer el campo e insertarlo en una variable no es
problema, el problema viene cuando quiero crear un
formulario dinamico con ese nombre. En tu mensaje me
pones, entre otras cosas:

Dim tipo as type = type.gettype(nombre)
Dim f as form = activator.createInstance(tipo)

Si yo pongo:
Dim tipo as type = type.gettype(variableDelCampo)
Dim f as form = activator.createInstance(tipo)

Esto no me crearia un formulario, no? Como lo haria para
crear ese formulario dinamico con una variable string?
Eres el unico que me esta contestando acerca de crear
formularios dinamicos, te lo agradezco, y me sacarias de
un gran apuro.
Uso vb.net
Muchisimas gracias, Pol
Respuesta Responder a este mensaje
#3 Tristan
11/08/2004 - 20:16 | Informe spam
Si. con lo que te he dicho se instancia un formulario. Tan solo te falta
mostrarlo:

Dim tipo as type = type.gettype(variableDelCampo)
Dim f as form = activator.createInstance(tipo)
f.Show() 'ShowDialog si lo quieres modal.


Ojo!. Ten mucho cuidado con el nombre del formulario, debe incluir
correctamente el nombre cualificado, con los espacios de nombres a los que
pertenece.

Por cierto, si el formulario se encuentra en un ensamblado no referenciado
en tu proyecto, que muy posiblemente será el caso por la pinta de tu
problema, debes obtener el ensamblado previamente:

Dim ensamblado As [Assembly] = [Assembly].LoadFrom(PathDelEnsamblado)
Dim f As Form = ensamblado.CreateInstance(nombre)


Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#4 Pol
11/08/2004 - 21:23 | Informe spam
Buenas Juan Carlos

Siento ser pesado, pero obtengo un error en
Dim f As Form = Activator.CreateInstance(tipo)

Exception no controlada del
tipo 'system.argumentNullException' en mscorlib.dll
Informacion adicional: El valor no puede ser nulo

Te doy mas detalles, los formularios no los tengo en el
proyecto ni nada, los quiero crear desde 0 dinamicamente,
me entiendes?

Pol
Si. con lo que te he dicho se instancia un formulario.


Tan solo te falta
mostrarlo:

Dim tipo as type = type.gettype(variableDelCampo)
Dim f as form = activator.createInstance(tipo)
f.Show() 'ShowDialog si lo quieres modal.


Ojo!. Ten mucho cuidado con el nombre del formulario,


debe incluir
correctamente el nombre cualificado, con los espacios de


nombres a los que
pertenece.

Por cierto, si el formulario se encuentra en un


ensamblado no referenciado
en tu proyecto, que muy posiblemente será el caso por la


pinta de tu
problema, debes obtener el ensamblado previamente:

Dim ensamblado As [Assembly] = [Assembly].LoadFrom


(PathDelEnsamblado)
Dim f As Form = ensamblado.CreateInstance(nombre)


Juan Carlos Badiola
MVP - C#


.

Respuesta Responder a este mensaje
#5 Tristan
12/08/2004 - 00:40 | Informe spam
Pol, revisa bien mi mensaje. Si, te entiendo, y no se explicartelo mejor. Si
las clases del formulario no están en ninguno de los ensamblados del
proyecto, tendrás que decirle en que ensamblado están.

Tal y como te he dicho en el ejemplo anterior, Assembly.LoadFrom(...)

Juan Carlos Badiola
MVP - C#
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida