在ASCX UserControl中的FindControl

时间:2011-03-21 14:11:22

标签: c# asp.net findcontrol

我正在尝试在我的ascx文件中找到一个我设置为runat服务器的DIV控件,但是当我调试它时,我得到findcontrol的值为null所以它找不到它,我做错了什么?

这是从我的ASPX页面调用的:

        HtmlGenericControl div = (HtmlGenericControl)FindControl("search");
        div.Visible = false;

我的ASCX代码:

<div class="contactsearch" id="search" runat="server" visible='true'>
//mycontent
</div>

3 个答案:

答案 0 :(得分:1)

FindControl只搜索第一个子节点,它不会递归到控制树中,使用类似这样的东西:

http://stevesmithblog.com/blog/recursive-findcontrol/

或者

http://ra-ajax.org/jquery-ish-selector-for-webcontrols

答案 1 :(得分:0)

首先检查控制树层次结构中是否存在contactsearch控件。你可以通过简单地探索控件的Controls属性来做到这一点。如果它在那里,你需要一个递归控制搜索才能找到它。

编辑:被安东尼奥殴打:P

答案 2 :(得分:0)

您可以使用递归算法进行搜索,如Markust和Antonio的答案中所述,它将在此实例中起作用。但是,它有一些问题。例如,如果您的页面上有两个usercontrol实例,它将无法工作。

但是,更大的问题是您要打破用户控件提供的封装。包含页面不应该知道usercontrol包含一个名为&#34; txtSearchCriteria的文本框,&#34;或者名为&#34; btnSearch的按钮。&#34; (或<div>命名&#34;搜索。&#34;)包含页面应仅使用usercontrol公开公开的接口与usercontrol一起使用。

我建议您在usercontrol中创建一个属性(或一组属性),以允许使用者以您期望的方式对控件进行反应。例如:

Public Boolean SearchControlsVisible
{
    get { return search.Visible; }
    set { search.Visible = value; }
}

即使您在页面上有多个usercontrol实例,该属性的代码也可以毫不含糊地访问&#34;搜索&#34; <div>。当您将控件放在页面上时,此方法还使您能够在ASPX标记中设置这些属性:

<my:ContactSearchPanel ID="contactSearch runat="server"
    SearchControlsVisible="false"
    ...etc... />

它不在您的问题中,但您还需要响应用户控件中发生的事件。有关从用户控件中引发事件的说明,请参阅此页面:http://msdn.microsoft.com/en-us/library/wkzf914z(v=vs.71).aspx

创建并公开事件后,您可以在标记中附加处理程序,如下所示:

<my:ContactSearchPanel ID="contactSearch runat="server"
    SearchControlsVisible="false"
    OnSearchClicked="SearchPanel_SearchClicked"
    ...etc... />