【问题标题】:Databinding on Custom Control with ITemplate使用 ITemplate 对自定义控件进行数据绑定
【发布时间】:2010-12-02 11:53:17
【问题描述】:

这是我的自定义服务器控件的示例代码:

[Designer(typeof(ContainerControlDesigner))]
[ToolboxData("<{0}:BlocArrondi runat=server><ContenuPrincipal></ContenuPrincipal></{0}:BlocArrondi>")]
public class BlocArrondi : WebControl
{
    private ITemplate _ContenuPrincipal;
    protected Panel _PanelContenuPrincipal = new Panel();

    public BlocArrondi()
    : base(HtmlTextWriterTag.Div)
    {

    }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateInstance(TemplateInstance.Single)]
    public ITemplate ContenuPrincipal
    {
            get { return _ContenuPrincipal; }
            set { _ContenuPrincipal = value; }
    }

    protected override void OnInit(EventArgs e)
    {
            base.OnInit(e);
            _PanelContenuPrincipal.ID = "PanelPrincipal";
            this.Controls.Add(_PanelContenuPrincipal);

            if (_ContenuPrincipal != null)
                    _ContenuPrincipal.InstantiateIn(_PanelContenuPrincipal);
    }
}

这里是实现:

<controls:BlocArrondi runat="server">
    <ContenuPrincipal>
        <asp:Label id="LabelInfo" runat="server" />
    </ContenuPrincipal>
</controls:BlocArrondi>

我的标签 LabelInfo 可以在后面的代码中访问,太棒了!

但如果我在 Repeater 或 ListView 中使用我的自定义控件,我将无法使用 ContenuPrincipal 模板中的 Container.DataItem 属性:

<asp:Repeater id="RepeaterInfos" runat="server">
    <ItemTemplate>
        <controls:BlocArrondi runat="server">
            <ContenuPrincipal>
                <asp:Label runat="server" Text="<%# (Container.DataItem as MsgInfo).DisplayMessage() " />
            </ContenuPrincipal>
        </controls:BlocArrondi>
    </ItemTemplate>
</asp:Repeater>

错误信息:

“System.Web.UI.Control”不包含“DataItem”的定义,并且找不到接受“System.Web.UI.Control”类型的第一个参数的扩展方法“DataItem”(您是否缺少using 指令还是程序集引用?)

如何在我的控件的 ContenuPrincipal 模板中使用 Container.DataItem 属性?

【问题讨论】:

    标签: asp.net data-binding custom-controls dataitem


    【解决方案1】:

    我用继承自 IDataItemContainer 的自定义 TemplateContainer 解决了我的问题:

        public class BlocArrondiContainer : Panel, IDataItemContainer
    

    改变:

        protected Panel _PanelContenuPrincipal = new Panel();
    
        [PersistenceMode(PersistenceMode.InnerProperty)]
        [TemplateInstance(TemplateInstance.Single)]
        public ITemplate ContenuPrincipal
        {
            get { return _ContenuPrincipal; }
            set { _ContenuPrincipal = value; }
        }
    

    作者:

        protected BlocArrondiContainer _PanelContenuPrincipal = new BlocArrondiContainer ();
    
        [PersistenceMode(PersistenceMode.InnerProperty)]
        [TemplateInstance(TemplateInstance.Single)]
        [TemplateContainer(typeof(BlocArrondiContainer))]
        public ITemplate ContenuPrincipal
        {
            get { return _ContenuPrincipal; }
            set { _ContenuPrincipal = value; }
        }
    

    覆盖 BlocArrondi 类的 OnDataBinding 方法:

        protected override void OnDataBinding(System.EventArgs e)
        {
            if (NamingContainer is IDataItemContainer)
                _PanelContenuPrincipal.DataItem = (NamingContainer as IDataItemContainer).DataItem;
    
            base.OnDataBinding(e);
        }
    

    【讨论】:

    • 完美解决您的问题。我几乎是一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2010-10-19
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多