【问题标题】:FindControl in ASCX UserControlASCX 用户控件中的 FindControl
【发布时间】:2011-03-21 14:11:21
【问题描述】:

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

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

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

我的 ASCX 代码:

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

【问题讨论】:

    标签: c# asp.net findcontrol


    【解决方案1】:

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

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

    或者这个

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      该属性的代码可以毫无歧义地访问“搜索”&lt;div&gt;,即使您在页面上有多个用户控件实例。这种方法还使您能够在将控件放置在页面上时在 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... />
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-10
          • 2013-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多