Aggiunta dinamica di controlli in ASP.NET Repeater
Domanda
Trovo me stesso avere un controllo ripetitore che viene archiviato in un documento XML. Il mio cliente ora richiede che le caselle di testo che vengono ripetute possano essere sia una casella di testo che una casella di controllo.
Non riesco a trovare un modo semplice per fare essenzialmente quanto segue:
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>
C'è un bel modo in cui posso estendere la mia attuale implementazione senza dover riscrivere la logica. Se potessi iniettare il controllo tramite " OnItemDataBound " anche questo andrebbe bene. Ma non riesco a farlo funzionare
Soluzione
Che dire di qualcosa di simile a questo nel tuo markup in ciascuno dei controlli della casella di testo e della casella di controllo?
Visible=<%= Eval("type").tostring() == "text") %>
Altri suggerimenti
Nel ripetitore, rilascia un pannello, quindi crea un gestore eventi per l'evento di associazione dei dati del ripetitore e crea a livello di codice TextBox o CheckBox e aggiungilo come controllo figlio del pannello. Dovresti essere in grado di ottenere il DataItem dall'argomento arg per ottenere informazioni come il tuo tipo " " attributo o valori per alimentare le proprietà del testo o le informazioni CSS, ecc.
Vorrei andare con la sugestion di mspmsp. Ecco un codice rapido e sporco come esempio:
Inseriscilo nel tuo aspx:
<asp:Repeater ID="myRepeater" runat="server" OnItemCreated="myRepeater_ItemCreated">
<ItemTemplate>
<asp:PlaceHolder ID="myPlaceHolder1" runat="server"></asp:PlaceHolder>
<br />
</ItemTemplate>
</asp:Repeater>
E questo nel tuo codice dietro:
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