2011-03-21 65 views
0

我想找到一個控制DIV,我已經設置爲runat服務器在我的ascx文件中,但是當我調試它時,我得到findcontrol的值爲null,所以它沒有找到它,什麼是我做錯了?在ASCX UserControl的FindControl

這是從我的ASPX頁面調用:

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

我ASCX代碼:

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

回答

0

您可以搜索使用遞歸算法,如Markust和安東尼的回答討論,它會在這種情況下工作。但是,它有一些問題。例如,如果在頁面上有兩個usercontrol實例,它將不起作用。

但是,更大的問題是您打破了usercontrol提供的封裝。包含頁面不應該知道usercontrol包含名爲「txtSearchCriteria」的文本框或名爲「btnSearch」的按鈕。 (或名爲「搜索」的<div>)。包含頁面只能使用usercontrol使用usercontrol公開的界面進行操作。

我建議您在usercontrol中創建一個屬性(或一組屬性),以允許消費者以您期望的方式與控件一起使用。例如:

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... /> 
0

首先檢查contactsearch控制是有在控制樹的層次結構。你可以通過簡單地探索控件的Controls屬性來做到這一點。如果它在那裏,您需要遞歸控制搜索才能找到它。

編輯:安東尼毆打:P