Agregando dinámicamente controles en ASP.NET Repeater
Pregunta
Me encuentro a mi mismo teniendo un control de repetidor que se está enlazando a un documento XML. Mi cliente ahora solicita que los cuadros de texto que se están repitiendo puedan ser un cuadro de texto o una casilla de verificación.
Parece que no puedo encontrar una manera fácil de hacer esencialmente lo siguiente:
if ((System.Xml.XmlNode)e.Item.DataItem.Attributes["type"] == "text")
<asp:TextBox runat="server" ID="txtField" Text='<%#((System.Xml.XmlNode)Container.DataItem).InnerText %>' CssClass="std"></asp:TextBox>
else
<asp:CheckBox runat="server" ID="txtField" Text='<%#((System.Xml.XmlNode)Container.DataItem).InnerText %>' CssClass="std"></asp:TextBox>
¿Existe una buena manera de extender mi implementación actual sin tener que volver a escribir la lógica? Si pudiera inyectar el control a través de " OnItemDataBound " eso también estaría bien. Pero parece que no puedo hacer que funcione
Solución
¿Qué pasa con algo similar a esto en su marca en cada uno de los controles de cuadro de texto y casilla de verificación?
Visible=<%= Eval("type").tostring() == "text") %>
Otros consejos
En su repetidor, suelte un Panel, luego cree un controlador de eventos para el evento de enlace de datos del repetidor y cree mediante programación el TextBox o el CheckBox y agréguelo como un control secundario del Panel. Debería poder obtener el elemento de datos de los argumentos del evento para obtener información como su " tipo " atributo o valores para alimentar sus propiedades de texto o información de css, etc.
Iría con la sugerencia de mspmsp. Aquí hay un código rápido y sucio como ejemplo:
Coloca esto en tu aspx:
<asp:Repeater ID="myRepeater" runat="server" OnItemCreated="myRepeater_ItemCreated">
<ItemTemplate>
<asp:PlaceHolder ID="myPlaceHolder1" runat="server"></asp:PlaceHolder>
<br />
</ItemTemplate>
</asp:Repeater>
Y esto en tu código:
dim plh as placeholder
dim uc as usercontrol
protected sub myRepeater_ItemCreated(object sender, RepeaterItemEventArgs e)
if TypeOf e Is ListItemType.Item Or TypeOf e Is ListItemType.AlternatingItem Then
plh = ctype(e.item.findcontrol("myPlaceHolder1"), Placeholder)
uc = Page.LoadControl("~/usercontrols/myUserControl.ascx")
plh.controls.add(uc)
end if
end sub