的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>
答
我通过改变用户控件解决了这个它使用了一个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);
好问题。似乎它应该工作,但我得到同样的问题。如果我查看监视窗口中的控件集合,我可以看到该控件。您始终可以重写FindControl方法。 –
这就是FindControlRecursive所做的,递归地遍历寻找我的控件的树,无济于事。 – Echilon