2010-12-02 72 views
6

自定義控件這是我的自定義服務器控件的代碼示例:數據綁定上了Itemplate

[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是對代碼訪問的背後,巨大!

但是,如果我在一箇中繼器或一個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屬性?

回答

4

我解決我的問題與自定義TemplateContainer從IDataItemContainer繼承:

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

Overrinding在BlocArrondi類OnDataBinding方法:

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

     base.OnDataBinding(e); 
    } 
+0

偉大的解決方案,您的問題。我來到幾乎相同。 – 2010-12-02 15:01:15