首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义ITemplate中的FindControl

自定义ITemplate中的FindControl
EN

Stack Overflow用户
提问于 2012-05-28 23:01:52
回答 2查看 1.2K关注 0票数 2

我有一个使用简单ITemplate的自定义UserControl:

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
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获得了对我的组合框的引用,但在我实际加载页面的地方出现了一个编译错误,即它是空的。

为了找到模板中的组合框,我使用:

代码语言:javascript
复制
var cboFilterCriticality = AspNetUtils.FindControlRecursive(optionsExpander,"cboFilterCriticality") as DropDownList;

实际的模板在页面上如下所示:

代码语言:javascript
复制
<l49:Expander runat="server" ID="optionsExpander">
    <ContentTemplate>
        ... other controls
            <asp:DropDownList ID="cboFilterCriticality" runat="server" ValidationGroup="filterGrid" DataTextField="Key" DataValueField="Value" />
    </ContentTemplate>
</l49:Expander>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-05 23:10:16

我通过更改使用ITemplate的UserControl解决了这个问题。由于某种原因,它在OnPreRender中调用InstantiateIn,这显然太晚了,无法在页面中呈现任何要由Page_Load拾取的内容-请参阅Page LifeCycle and UserControls (half way down)。我把InstantiateIn移到了UserControl中的OnInit上,问题自己解决了。

票数 1
EN

Stack Overflow用户

发布于 2015-09-16 13:39:08

The的WebForm页面:

代码语言:javascript
复制
<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>

按如下方式定义Expander类:

代码语言:javascript
复制
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);

    }
}

在页面的OnInit中:

代码语言:javascript
复制
public override void OnInit(EventArgs e){
    base.OnInit(e);
    ViewState["ContentTemplateContainerID"] =  ContentTemplateContainer.ClientID;
}

最后在Javascript中:

代码语言:javascript
复制
var containerID = ViewState("ContentTemplateContainerID");
var elID = $get(containerID)[0].id;
var expander = $find(elID);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10786712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档