0

我试图在我的 ascx 文件中找到我设置为运行服务器的 DIV 控件,但是当我调试它时,我得到 findcontrol 的值为 null 所以它没有找到它,我做错了什么?

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

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

我的 ASCX 代码:

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

3 回答 3

1

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

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

或这个

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

于 2011-03-21T14:14:41.683 回答
0

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

编辑:被安东尼奥击败:P

于 2011-03-21T14:15:49.877 回答
0

您可以使用递归算法进行搜索,如 Markust 和 Antonio 的答案中所讨论的,它可以在这种情况下工作。但是,它有一些问题。例如,如果您的页面上有两个用户控件实例,它将不起作用。

但是,更大的问题是您破坏了用户控件提供的封装。包含页面不应知道用户控件包含名为“txtSearchCriteria”的文本框或名为“btnSearch”的按钮。(或<div>命名为“搜索”。)包含页面应仅使用用户控件公开公开的接口与用户控件一起使用。

我建议您在用户控件中创建一个属性(或一组属性),以允许消费者以您期望的方式与控件进行交互。例如:

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

<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... />
于 2011-03-21T14:48:59.557 回答