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

6

我发现自己有一个重复控件,它正在绑定到一个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”注入控件,那也可以。但是我似乎无法使其工作。

4个回答

5
在您的Repeater中,拖放一个Panel,然后为Repeater的数据绑定事件创建一个事件处理程序,并以编程方式创建TextBox或CheckBox,并将其添加为Panel的子控件。您应该能够从事件参数中获取DataItem来获取信息,例如您的"type"属性或值以提供文本属性或css信息等。

4

我建议您采用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") %>

0
如果需要根据数据添加控件,则可以使用以下方法:
<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));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接