Динамично добавяне на контроли в ASP.NET Repeater

Откривам, че имам контрол на повторителя, който е свързан с данни към xml документ. Моят клиент сега изисква текстовите полета, които се повтарят, да могат да бъдат или текстово поле, или поле за отметка.

Не мога да намеря лесен начин да направя по същество следното:

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>

Има ли добър начин да разширя текущата си реализация, без да се налага да пренаписвам логиката. Ако можех да инжектирам контролата чрез "OnItemDataBound", това също би било добре. Но изглежда не мога да го накарам да работи


person Jacob T. Nielsen    schedule 24.09.2008    source източник


Отговори (4)


Какво ще кажете за нещо подобно на това във вашето маркиране във всяко текстово поле и поле за отметка контроли?

Visible=<%= Eval("type").tostring() == "text") %>
person Tom Ritter    schedule 24.09.2008

Във вашия повторител пуснете панел, след това създайте манипулатор на събитие за събитието за обвързване на данни на повторителя и програмно създайте TextBox или CheckBox и го добавете като дъщерна контрола на панела. Трябва да можете да получите DataItem от аргументите на събитието, за да получите информация като вашия атрибут "тип" или стойности, за да подадете вашите текстови свойства или css информация и т.н.

person mspmsp    schedule 24.09.2008

Бих се съгласил с предложението на mspmsp. Ето бърз и мръсен код като пример за това:

Поставете това във вашия aspx:

<asp:Repeater ID="myRepeater" runat="server" OnItemCreated="myRepeater_ItemCreated">
    <ItemTemplate>
        <asp:PlaceHolder ID="myPlaceHolder1" runat="server"></asp:PlaceHolder>
        <br />
    </ItemTemplate>
</asp:Repeater>

И това във вашия код отзад:

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
person vmarquez    schedule 14.10.2008

Ако е необходимо да се добавят контроли въз основа на данни, тогава може да се използва този подход:

<asp:Repeater ID="ItemsRepeater" runat="server" OnItemDataBound="ItemRepeater_ItemDataBound">
    <itemtemplate>
        <div>
            <asp:PlaceHolder ID="ItemControlPlaceholder" runat="server"></asp:PlaceHolder>
        </div>
    </itemtemplate>
</asp:Repeater>
protected void ItemRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    var placeholder = e.Item.FindControl("ItemControlPlaceholder") as PlaceHolder;
    var col = (ItemData)e.Item.DataItem;

    placeholder.Controls.Add(new HiddenField { Value = col.Name });
    placeholder.Controls.Add(CreateControl(col));
}
person mybrave    schedule 26.05.2021