miércoles, 10 de febrero de 2010

-Como crear ids de .net accesibles, usando un repeater

-Como asignar el valor de un ClientID a otro control en un repeater
Para ponernos en situación, queremos hacer lo siguiente.

Tenemos un repeater, que itera sobre unos datos pasados desde el codeBehind.

A su vez tenemos un pluggin de jquery que muestra unos Tooltips dependiendo del item por el que se pase encima.

Pues bien , el problema viene cuando tenemos que asignar un panel a cada enlace en cada item, me explico.

tendremos un enlace, que al pasar por encima, saldran unos datos determinados de ese item, entoces hay que asignar en el pluggin de Jquery, el Id del panel que contiene esos datos.

pero claro, problema, cuando hay un control en un repeater, asp (muy majo el) genera un id unico para evitar colisiones, con lo que si ponemos un runat server a ese panel, como conseguiriamos el id??

Hay que tener en cuenta una cosa muy importante, lo que hay dentro de un repeater, hasta que no se bindean los datos, no existe en el ambito de la aplicación , con lo que si ponemos ...
<%= pnlDesglose.ClientID%> dara un error de que no encuentra ese objeto en el ambito....entoces solo nos queda una solución.

hacerlo desde el code behind.usease codigo del servidor.

Y ahora de como seria el codigo de servidor, como vemos, tenemos que hacerlo en el itemDataBound del repeater, que es donde tendremos la visibilidad de cada item del repeater.

protected void RptrLinks_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
HtmlAnchor link = ((HtmlAnchor)e.Item.FindControl("lnka"));
Panel pan = ((Panel)e.Item.FindControl("pnlDesglose"));

link.Attributes["rel"] = "#"+pan.ClientID;

HtmlAnchor es lo mismo que decir (control de link , o en lenguaje html "a")
Pues bien aqui vemos el funcionamiento. por cada iteracción del repeater, buscamos el control...

HtmlAnchor link = ((HtmlAnchor)e.Item.FindControl("lnka"));
Panel pan = ((Panel)e.Item.FindControl("pnlDesglose"));

y se asigna a las variables que acabamos de crear
despues añadimos un nuevo atributo al link

link.Attributes["rel"] = "#"+pan.ClientID;

Esto en pocas palabras, hace que en el codigo de cliente quede algo asi

runat="server"
href=""
class="localtip"
rel = "#ctl001_blablabla_pnlDesglose"
title="Desglose" >
Desglose

No hay comentarios:

Publicar un comentario