【发布时间】:2012-06-02 22:37:19
【问题描述】:
我有一个使用简单 ITemplate 的自定义 UserControl:
<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 获得了对我的组合框的引用,但是当我实际加载页面时,它是 null 的编译错误。
要在模板中找到组合框,我正在使用:
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>
【问题讨论】:
-
好问题。似乎它应该工作,但我遇到了同样的问题。如果我查看监视窗口中的控件集合,我可以看到控件。你总是可以覆盖 FindControl 方法。
-
FindControlRecursive就是这样做的,递归地遍历树来寻找我的控制,但无济于事。
标签: c# asp.net .net templates itemplate