1

我有一个 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 之间的某个地方,这些控件被删除了。

有任何想法吗?

谢谢南顿

4

1 回答 1

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; 
    }

}
于 2013-05-06T20:35:01.653 回答