Динамическое добавление элементов управления в 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", это тоже было бы прекрасно.Но, похоже, я не могу заставить это сработать
Решение
Как насчет чего-то подобного в вашей разметке в каждом элементе управления textbox и checkbox?
Visible=<%= Eval("type").tostring() == "text") %>
Другие советы
В вашем ретрансляторе удалите панель, затем создайте обработчик событий для события привязки данных ретранслятора и программно создайте текстовое поле или флажок и добавьте его в качестве дочернего элемента управления панели.Вы должны быть в состоянии получить DataItem из аргументов события, чтобы получить информацию, такую как ваш атрибут "type" или значения для ввода ваших текстовых свойств или CSS-информации и т.д.
Я бы согласился с предложением 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