我发现我的自己有一个转发器控件,它被数据绑定到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”注入控件,那也没关系。但我似乎无法使其发挥作用
答案 0 :(得分:5)
在转发器中,删除一个Panel,然后为转发器的数据绑定事件创建一个事件处理程序,并以编程方式创建TextBox或CheckBox,并将其添加为Panel的子控件。您应该能够从事件args获取DataItem,以获取诸如“type”属性之类的信息,以提供Text属性或css信息等。
答案 1 :(得分:3)
在每个文本框和复选框控件的标记中,与此类似的内容怎么样?
Visible=<%= Eval("type").tostring() == "text") %>
答案 2 :(得分:3)
我会选择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 :(得分: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));
}