Динамическое добавление элементов управления в ASP.NET Повторитель

#asp.net #controls #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», это тоже было бы прекрасно. Но я, кажется, не могу заставить это работать

Ответ №1:

В своем повторителе удалите панель, затем создайте обработчик событий для события привязки данных повторителя и программно создайте текстовое поле или флажок и добавьте его в качестве дочернего элемента управления панели. Вы должны быть в состоянии получить элемент данных из аргументов событий, чтобы получить такую информацию, как ваш атрибут «тип» или значения, для передачи свойств текста или информации css и т. Д.

Ответ №2:

Я бы пошел с сахаром 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
 

Ответ №3:

Как насчет чего-то подобного в вашей разметке в каждом текстовом поле и элементах управления флажками?

 Visible=<%= Eval("type").tostring() == "text") %>
 

Ответ №4:

Если необходимо добавить элементы управления на основе данных, то можно использовать этот подход:

 <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));
}