我正在尝试在我的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>
答案 0 :(得分:1)
答案 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... />