您可以使用递归算法进行搜索,如 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... />