COMO UTILIZAR UN PLACEHOLDER

Para efectos de facilidad (la mia jaja) voy a hacer el ejemplo en codigo VB.NET.

Como a todos en cierto momento nos ha ocurrido, hemos tenido la necesidad de crear cierta flexibilidad en nuestras aplicaciones, pero como hacer esto en .net?
Para eso tenemos un objeto dentro del toolkit de nombre placeholder.






Primero en un webForm vamos a agregar un objeto placeholder para esto vamos a buscarlo dentro del visual studio en la parte de herramientas y arrastrarlo a nuestro web form.











Como se utiliza?

Para que el placeholder funcione tenemos que darle a entender que objetos queremos crear en tiempo de ejecucion eso se realiza de la siguiente forma:


Donde el_Control es el nombre de la variable que vamos a delegar al placeholder y el tipo del control esta definido dentro de los controles validos en .net (etiqutas caja de texto, botones, dataGrid's,etc).
Dim Label1 As New label
Dim TextBox1 As New TextBox
Dim Button1 As New Button
Explicado lo anterior la estructura para crear un control en tiempo de ejecucion quedaria de la siguiente forma:


Protected SubPage_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim Label1 As New label
Dim TextBox1 As New TextBox
Dim Button1 As New Button
label1.ID = "label1"
label1.Text = "ETIQUETA CREADA EN TIEMPO DE EJECUCION"
Button1.ID = "cmd"
Button1.Text = "HAZ CLICK AQUI"
Text1.ID = "Txt1"
PlaceHolder1.Controls.Add(label1)
PlaceHolder1.Controls.Add(Text1)
PlaceHolder1.Controls.Add(Button1)
End Sub

El codigo anterior nos da como resultado algo parecido a esto:


ya sabemos como crear controles en tiempo de ejecucion, ahora veremos el metodo para acceder a ellos.
para acceder a los controles contenidos dentro del placeholder vamos a utilizar el metodo FindControl auxiliado de otra variable del mismo tipo del control al cual vamos a acceder de tal manera que la estructura quedaria de la siguiente forma:





empezaremos por la etiqueta:
Para esto vamos a crear una tabla en la cual vamos a colorcar en una fila un boton creado en tiempo de diseño y en la otra fila nuestro placeholder con el cual creamos los objetos en tiempo de ejecucion.
Dentro del codigo de nuestro boton hecho en tiempo de diseño vamos a escribir el siguiente codigo:


Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Referencia_lb As Label = PlaceHolder1.FindControl("label1")
Referencia_lb.Text = "CAMBIANDO EL TEXTO DEL OBJETO CREADO EN TIEMPO DE EJECUCION"
End Sub

El resultado quedaria algo asi:


De igual forma podemos acceder a los datos de la caja de texto.
Pero el boton es cosa muy distinta por que a este le tenemos que ligar una sub rutina para que ejecute una determinada accion, pero como se hace?
Para esto tenemos que encontrar el metodo de ligar el boton creado dinamicamente con esta subrutina.

las instrucciones que nos permite esta maravilla se llaman AddHandler y addressOf

sintaxis:

AddHandler nos permite acceder a la referencia del objeto.evento en el caso del boton el evento Click, por otro lado la instruccion addressOf nos da acceso a la sub rutina que se lanza al momento de cumplirse el evento.

Retomando el ejemplo anterior y realizando unas pequeñas modificaciones nos quedaria algo asi:


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
CrearObjetos()
End Sub

Function CrearObjetos() As Nullable
Dim label1 As New Label
Dim Button1 As New Button
Dim Text1 As New TextBox
Text1.ID = "Txt1"
label1.ID = "label1"
label1.Text = "EL TEXTO DEL OBJETO SE A CREADO EN TIEMPO DE EJECUCION"
Button1.ID = "cmd"
Button1.Text = "HAZ CLICK AQUI"
AddHandler Button1.Click, AddressOf DynamicButton
PlaceHolder1.Controls.Add(label1)
PlaceHolder1.Controls.Add(Text1)
PlaceHolder1.Controls.Add(Button1)
Return Nothing
End Function

Sub DynamicButton(ByVal Sender As System.Object, ByVal e As System.EventArgs)
Dim Referencia_lb As Label = PlaceHolder1.FindControl("label1")
Referencia_lb.Text = "CAMBIANDO EL TEXTO DEL OBJETO CREADO EN TIEMPO DE EJECUCION"
End Sub

Es importante que el tanto el Addhandler como el AddressOf sean agregados al boton justo antes de que este sea agregado al objeto placeholder para que el evento sea ligado correctamente.

Funciones mas utilizadas en ASP.NET

Equivalencia de AppPath
System.AppDomain.CurrentDomain.BaseDirectory

la forma mas comun de usarlo es de la siguiente forma:
Protected Shared AppPath = System.AppDomain.CurrentDomain.BaseDirectory

Obtener nombre del Server
System.Net.Dns.GetHostName()

Llenar un TemplateColumn desde una consulta
Text='<%# DataBinder.Eval(Container.DataItem, "Aqui la columna") %>'

Obtener acceso a los itemTemplates en un DataGrid
Variable de tipo del control = e.Item.Cells(Indice de celda).FindControl(“Nombre del objeto”)

EJEMPLO:
Si dentro del DataGrid tenemos un Label con el nombre Lb_Etiqueta entonces la instruccion quedaria de la siguiente forma.

Dim MiEtiqueta As Label = e.item.Cells(1).findControl("Lb_Etiqueta")

este metodo lo utilizamos dentro del ItemCommand del Datagrid, ahora si lo que queremos es acceder desde un boton fuera del datagrid la instruccion quedaria de la siguiente forma.

DataGrid.Items(Index).findControl("Lb_Etiqueta")