Ir al contenido principal

Haciendo controles anidados


Muchas veces me he preguntado como hacen .Net para anidar los controles. en mis primeras experiencias al desarrollar mi primer control. me fue imposiblee realizar esto.

bueno lo que queremos lograr seria algo como esto:

<cc1:MyControl ID="server"   popUpID="panel1" Title="este es el titulo" >
<cc1:MyControlColumnas label="Nombre Persona" name="nombre" runat="server" Visible=true/>
<cc1:MyControlColumnas label="Edad Persona" name="edad" runat="server" Visible=true/>
</cc1:MyControl>




bueno por parte, como ya sabemos hacer nuestro control, ahora solo tenemos que hacer un una clase extienda de control Builder

  Public Class MyPortalBuilder : Inherits ControlBuilder
Public Overrides Function GetChildControlType( _
ByVal tagName As String, _
ByVal attributes As IDictionary) As Type
If tagName.ToLower() = "MyPortalColumna".ToLower Then
Return GetType(MyPortalColumna)
End If
Return Nothing
End Function
End Class



En este codigo sobre-escribimos el metodo GetChildControlType y le decimos que nos retorne el tipo de nuestro elemento que esperamos.


Pero eso no es todo en nuestra clase del control padre, tenemos que agregar esto.
ControlBuilder(GetType(MyPortalBuilder)), _
actualemten mi declaracion antes de mi clase es la siguiente:
 < _
ParseChildren(False), _
ControlBuilder(GetType(MyPortalBuilder)), _
ToolboxData("<{0}:MyPortal runat=""server"" ID='MyPortal1' >" + vbCrLf + _
"<{0}:MyPortalColumna runat=""server"">" + vbCrLf _
+ "<{0}:MyPortalPortlet runat=""server"" title=""Title"" contentId=""div1""/>" + vbCrLf _
+ "</{0}:MyPortalColumna>" + vbCrLf _
+ "</{0}:MyPortal> ")> _



Pero aun no termina esta tarea, parece tediosa y larga, pero la verdad es que en la practica no lo es tanto este es el ultimo paso.


Definimos una coleccion(en la clase padre) para guardar todos los hijos que esperamos, en mi caso yo utilice un arraylist. y tenemos que sobreescribir un metodo, para que llenemos nuestro Arraylist.

Protected Overrides Sub AddParsedSubObject(ByVal obj As Object)
If TypeOf (obj) Is MyPortalColumna Then
Me._columnas.Add(obj)
End If
End Sub


de esta forma ya tenemos nuestros controles ya listos.

IMPORTANTE

  • Nuestra clase hija tambien tiene que extender de webControl, si no esto no funcionara.

  • en el ultimo codigo(el metodo AddParsedSubObject) "_columnas" es mi attributo de la clase padre.




  • Conclusion

    con esto podemos hacer casi lo que se nos ocurra, podemos recorrer los hijos y leer valores desde ellos de forma trasparente. en mi caso realize una grilla, y dentro de ella tengo una coleccion de columnas, estas columnas le indican a la grilla que valores mostrar.

    Comentarios

    1. Muy interesante lo de controles anidados, pero mi problema está con un control listview que tiene anidado otro, el primero va estupendamente, muestra el segundo, pero al darle a un botón con el command name edit en el listview anidado da un error y no carga el edititemtemplate, y si implemento el evento onedittemplate y pongo edit index como el que se esté modificando no lo aplica hasta que se refresque la página, y me lleva por la calle de la amargura, sabéis pq puede ser??
      Gracias

      ResponderEliminar
    2. Disculpa la demora.

      Primero que todo gracias por el comentario y leer mi blog.

      por casualidad estas usando UpadatePanel??

      El control que esta mas adentro en la generarqui es nativo de .net o lo extendiste??.

      --
      Atte.
      Victor Hugo Saavedra
      http://vhspiceros.blogspot.com

      ResponderEliminar
    3. No estoy usando ningún update panel.

      La jerarquía de controles es que dentro de un control ascx tengo una serie de código que va bien, la única pega es que tengo controles listview dentro de otros.

      Es decir, un listview con sus datos que tiene dentro del itemtemplate otro listview que lo cargo a traves del evento ItemDataBound, de forma que cada vez que pasa por cada registro cargo listview hijo.

      El caso es que esto va estupendamente, muestra los datos anidados muy bien, pero la pega está al darle a algún botón de con el command name edit dentro del listview hijo no carga el edit item template, pero si lo carga si refresco.

      El problema me supongo que será por el ciclo de vida de los objetos, que se añaden en el init, pero los eventos se inicializan en el preinit, supongo que será por eso pero no se ni como arreglarlo ni si realmente será eso..... Si tienes alguna sugerencia.

      Muchas gracias por tu interés.

      muchas gracias por tu interés

      ResponderEliminar
    4. la verdad es que es medio complicado determinar que pueda hacer.

      Y si tiene mucho sentido el tema de alcance o ciclo de vida del objeto.

      a vuelo de pajaro como se dice, deberias intervenir el pre-render o render. y ver que datos tiene el control hijo para poder cargalo en el padre.

      fijate que estos metodos tengan un mybase.render o algo asi.
      Ojala funcione.

      --
      Atte.
      Victor Hugo Saavedra
      http://vhspiceros.blogspot.com

      ResponderEliminar

    Publicar un comentario

    Entradas populares de este blog

    buscar columnas en todas las tablas Sql Server

    me vi en la necesidad de buscar en todas las tablas de una base de datos por un comodin ya que no conocia bien el modelo de la base de datos.
    aqui les dejo el sql.
    SELECT sysobjects.name AS table_name, syscolumns.name AS column_name, systypes.name AS datatype, syscolumns.LENGTH AS LENGTH FROM sysobjects INNER JOIN syscolumns ON sysobjects.id = syscolumns.id INNER JOIN systypes ON syscolumns.xtype = systypes.xtype WHERE (sysobjects.xtype = 'U') and (UPPER(syscolumns.name) like upper('%myFieldName%')) ORDER BY sysobjects.name, syscolumns.colid


    Solo tienen que cambiar donde dice "myFieldName"por el nombre de la columna que desean buscar.

    --
    Atte.
    Victor Hugo Saavedra
    http://vhspiceros.blogspot.com

    "is not null" o "<> Null" en Sql Server

    Trabajando con NHinbernate. mapeando unas clases, guardaba unos datos y hacia esta consulta para ver si estaba bien:


    select * from table where campo <> NULL;


    pero no me arrojaba los datos que queria y luego darle y darle vueltas hice esta consulta.

    select * from table where campo is not NULL;


    y ahi me di cuenta que el mapeo de Hibernet, y los cambios que habia hecho estaban bien. perdi toda una mañana de trabajo por esto :(.


    Asi no es lo mismo "is not null" o "<> Null", por lo menos en Sql Server

    Entonces ahora cada vez que quiera preguntar si un capo no es Null, voy a preguntar por "IS NOT NULL".

    En caso de que quiera saber si un campo es null "IS NULL".




    --
    Atte.
    Victor Hugo Saavedra
    http://vhspiceros.blogspot.com

    Aplicación y Aplicativo

    Cada dia es mas comun escuchar de aplicativo para referirse a un programa informatico,  esto puede sonar bastante cool, pero la verdad es que no lo es. El termino "aplicativo"  no existe en informatica, la palabra correcta para referirse a un programa informatica es "Aplicacion".

    Las definiciones segun la real academedia española son;


    Aplicación (informatica): Programa preparado para una utilización específica, como el pago de nóminas, formación de un banco de términos léxicos, etc.Aplicativo: Que sirve para aplicar algo.
    y ustedes van a seguir usando aplicativo en vez de aplicación
    Links:
    http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=aplicativo http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=aplicaci%F3n


    --
    Atte.
    Victor Hugo Saavedra
    http://vhspiceros.blogspot.com