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

4 回答 4

5

在您的转发器中,放置一个面板,然后为转发器的数据绑定事件创建一个事件处理程序,并以编程方式创建 TextBox 或 CheckBox 并将其添加为面板的子控件。您应该能够从事件 args 中获取 DataItem 以获取诸如“类型”属性或值之类的信息,以提供您的 Text 属性或 css 信息等。

于 2008-09-24T16:14:28.667 回答
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
于 2008-10-14T03:21:33.927 回答
3

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

Visible=<%= Eval("type").tostring() == "text") %>
于 2008-09-24T16:09:57.773 回答
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));
}
于 2021-05-26T15:41:07.603 回答