的FindControl定制了Itemplate

问题描述:

我有一个使用一个简单的ITemplate一个自定义的用户控件:的FindControl定制了Itemplate

<asp:Panel runat="server" ID="pnlExpander" CssClass="expander"> 
    <asp:HyperLink runat="server" ID="lnkExpand" Text="More Options" NavigateUrl="#" CssClass="lnkExpand"/> 
    <asp:Panel runat="server" ID="pnlContent" CssClass="expanderContent" style="display: none"> 
     <asp:PlaceHolder runat="server" ID="plcContent"/> 
    </asp:Panel> 
</asp:Panel> 

模板呈现两个简单的属性:

public class Expander { 
    private ITemplate _contentTemplate; 
     public ITemplate ContentTemplate { 
      get { return _contentTemplate; } 
      set { _contentTemplate = value; } 
    } 
    protected override void OnPreRender(EventArgs e) { 
      if (ContentTemplate != null) { 
       ContentTemplate.InstantiateIn(plcContent); 
      } 
    } 

一切显示正常,但我不能在模板中使用FindControl。我从VS intellisense中得到了一个对我的组合框的引用,但是一个编译错误,它实际上并没有加载页面。

要查找组合框在日模板,我使用:

var cboFilterCriticality = AspNetUtils.FindControlRecursive(optionsExpander,"cboFilterCriticality") as DropDownList; 

而实际的模板看起来像这样在页面上:

<l49:Expander runat="server" ID="optionsExpander"> 
    <ContentTemplate> 
     ... other controls 
      <asp:DropDownList ID="cboFilterCriticality" runat="server" ValidationGroup="filterGrid" DataTextField="Key" DataValueField="Value" /> 
    </ContentTemplate> 
</l49:Expander> 
+0

好问题。似乎它应该工作,但我得到同样的问题。如果我查看监视窗口中的控件集合,我可以看到该控件。您始终可以重写FindControl方法。 –

+0

这就是FindControlRecursive所做的,递归地遍历寻找我的控件的树,无济于事。 – Echilon

我通过改变用户控件解决了这个它使用了一个ITemplate。出于某种原因,它在OnPreRender中调用InstantiateIn,这显然太晚了,无法呈现Page_Load在页面中拾取的任何东西 - 请参阅Page LifeCycle and UserControls (half way down)。我在UserControl中将InstantiateIn移动到OnInit,并且问题自行解决。

的Asp.net的Web窗体页面:在页面的OnInit

public class Expander { 
    public ITemplate ContentTemplate {get ;set;} 
    public HtmlGenericControl ContentTemplateContainer{get;set;} 
    protected override void OnInit(EventArgs e) { 
     this.ContentTemplateContainer = new HtmlGenericControl("div"); 
     if (ContentTemplate != null) { 
      ContentTemplate.InstantiateIn(container); 
     } 
     plcContent.Controls.Add(container); 

    } 
} 

<asp:Panel runat="server" ID="pnlExpander" CssClass="expander"> 
    <asp:HyperLink runat="server" ID="lnkExpand" Text="More Options" NavigateUrl="#" CssClass="lnkExpand"/> 
    <asp:Panel runat="server" ID="pnlContent" CssClass="expanderContent" style="display: none"> 
     <asp:PlaceHolder runat="server" ID="plcContent"/> 
    </asp:Panel> 
</asp:Panel> 

定义扩展类如下

public override void OnInit(EventArgs e){ 
    base.OnInit(e); 
    ViewState["ContentTemplateContainerID"] = ContentTemplateContainer.ClientID; 
} 

终于在Javascript:

var containerID = ViewState("ContentTemplateContainerID"); 
var elID = $get(containerID)[0].id; 
var expander = $find(elID);