我有一个UserControl,我有一个FormView。
表单视图只有一个InsertItemTemplate(我不需要任何其他内容)
<irt:FormView ID="FormViewInsertEvent" DefaultMode="Insert" runat="server" DataKeyNames="EVENT_ID"
DataSourceID="SqlDataSourceIocEvents">
<InsertItemTemplate>
//Some form elements (text boxes and labels etc.) which are common
<%if (CustomContent != null)
{ %>
<hr />
<asp:PlaceHolder runat="server" ID="PlaceHolderCustomContent"></asp:PlaceHolder>
<%} %>
// Link buttons with insert command
</InsertItemTemplate>
</irt:FormView>
背后的代码是这样的:
public partial class EventControl : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (CustomContent != null)
{
Control ph = FormViewInsertEvent.FindControl("PlaceHolderCustomContent");
CustomContent.InstantiateIn(ph);
}
}
[
DefaultValue(null),
PersistenceMode(PersistenceMode.InnerProperty),
TemplateInstance(TemplateInstance.Single),
Browsable(false)
]
public ITemplate CustomContent {
get;
set;
}
}
在调用者(页面)中我有这样的东西(我将数据源传递给UC并从后面的代码中设置FormView的数据源。这里没有问题):
<irt:EventControl ID="EventControl" runat="server" DataSourceID="SqlDataSourceIocEvents">
<CustomContent>
Custom Field:
<asp:TextBox ID="TextBoxCustomField" runat="server" Text='<%# Bind("CustomField") %>' />
</CustomContent>
</irt:EventControl>
我的问题是;当我点击一个链接按钮和PostBack时,自定义内容,即我放在模板字段中的内容,就会消失。
如果我将asp:PlaceHolder放在FormView.InsertItemTemplate之外,则没有问题。然而,这不是我需要的。
我需要InsertItemTemplate中的ITemplate甚至在回发后保留。看起来我的模板被添加到PlaceHolder的控制列表中,但在PreRender和Render之间,这些控件将被删除。
有什么想法吗?
由于 南盾
答案 0 :(得分:0)
我之前修复了这个问题所以我完全不记得解决方案(我匆匆发布这个试图帮助某人)我相信你在下面看到的类和属性属性修复了这个问题。
请注意,Irt.Web.ServerControls.PlaceHolder只是一个派生自System.Web.UI.WebControls.PlaceHolder控件的类。如果这样可以解决问题,请标记。
[PersistChildren(true)]
public partial class EventControl : UserControl
{
protected override void OnInit(EventArgs e)
{
if (CustomContent != null)
{
CustomContent.InstantiateIn(PlaceHolderCustomContent);
}
base.OnInit(e);
}
public string ComponentLabel { get; set; }
public string ComponentValue { get; set; }
[DefaultValue(null)]
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(Irt.Web.ServerControls.PlaceHolder), System.ComponentModel.BindingDirection.TwoWay)]
[TemplateInstance(TemplateInstance.Single)]
[Browsable(false)]
[Bindable(true, BindingDirection.TwoWay)]
public ITemplate CustomContent
{
get;
set;
}
}