在ASP.NET Repeater中动态添加控件

时间:2020-03-06 14:40:20  来源:igfitidea点击:

我发现自己有一个转发器控件,该控件正在数据绑定到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"注入控件,那也可以。但我似乎无法使它起作用

解决方案

在每个文本框和复选框控件的标记中,与此类似的内容又如何呢?

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

在转发器中,放置一个Panel,然后为转发器的数据绑定事件创建事件处理程序,并以编程方式创建TextBox或者CheckBox并将其添加为Panel的子控件。我们应该能够从事件args中获取DataItem,以获取诸如" type"属性之类的信息或者用于馈送Text属性或者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