Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: WHK en 25 Julio 2013, 21:51 pm



Título: Como cargar un control a traves de un namespace de forma dinamica?
Publicado por: WHK en 25 Julio 2013, 21:51 pm
Estoy haciendo un desarrollo en c# para paginas web ASP y actualmente estoy haciendo las inclusiones de los themes y módulos de la siguiente manera:

Código:
Control theme = (Control)LoadControl(config.theme.rutas.DirectorioLocal);

/* Agrega el Theme al control principal */
this.FindControl("bufferTheme").Controls.Add(theme);

No hay ningún problema pero quiero cambiar la manera de cargar dinamicamente un control dentro de otro sin tener que depender de las rutas de archivos. Se me ocurrió intentar llamar al namespace de manera dinámica pero no resulta, al parecer c# no lo soporta:

Código:
(Control)Themes["themeelegido"]

Donde el namespace del archivo Default.Master es "Themes.themeelegido.Default"

Hay algo similar? por ejemplo:
Código:
(Control)LoadControlFromNameSpace("Themes." + theme.nombre + ".Default")


Título: Re: Como cargar un control a traves de un namespace de forma dinamica?
Publicado por: Novlucker en 25 Julio 2013, 22:39 pm
Código
  1. Type t = Type.GetType("Themes.themeelegido.Default");
  2. Control theme = (Control)LoadControl(t, null);

Con algo como esto debería de funcionar, pero no lo he probado :P

Saludos


Título: Re: Como cargar un control a traves de un namespace de forma dinamica?
Publicado por: WHK en 26 Julio 2013, 15:26 pm
Por alguna extraña razón me pasa sin errores pero no se escribe el control html en la pagina, queda en blanco.

Al ver los objetos desde visual studio me aparece que el objeto theme si está bien definido y equivale al control del theme, pero al agregarlo sobre el otro control este queda en blanco como si el código html no existiera y lo mas raro es que no me arroja ningún error.

Código
  1. /* Carga el Theme */
  2. Type t = Type.GetType("Themes.simpleLayout.Default");
  3. Control theme = (Control)LoadControl(t, null);
  4. //Control theme = (Control)LoadControl(config.theme.rutas.archivoDefaultVirtual);
  5.  
  6. /* Agrega el Theme al control principal */
  7. this.FindControl("bufferTheme").Controls.Add(theme);

..... ahora que me doy cuenta navegando entre el arbol de subojetos del objeto theme dice que no tiene ningún master asociado y se supone que el control es el master, está definido pero está como vacio :-/ y el nombre del namespace está bien puesto.

Intenté ponerlo sin el .Default pero ahi si me arroja un error.

Por lo menos ya tengo una pequeña luz sobre como hacerlo, ahora es cosa de ver porque devuelve un valor en blanco. Será porque loadcontrol acepta un string de ruta y no de tipo? quien sabe, a lo mejor me hubiera dado un error si fuera asi de estricto.


Título: Re: Como cargar un control a traves de un namespace de forma dinamica?
Publicado por: Novlucker en 26 Julio 2013, 15:46 pm
Hay un problema evidente que no tuve en cuenta, en el ascx está la inicialización de los controles, y cuando cargas el control desde la clase te estas perdiendo esa parte :-\.
http://msdn.microsoft.com/en-us/library/ewtd66a0%28v=VS.90%29.aspx#CommunityContent (último comentario)

Saludos


Título: Re: Como cargar un control a traves de un namespace de forma dinamica?
Publicado por: WHK en 26 Julio 2013, 16:27 pm
bueno, mejor lo he dejado como ruta de archivo tal como estaba antes xD igual gracias.