2014-01-22 80 views
1

我試圖做一個功能來禁用特定頁面中的所有控件。循環通過控件asp.net

當我依次通過,所有的控制都是不同之處在於設置的Runat =「服務器」

這是設計的總圖在div裏面的那些禁用:

<form id="form1" runat="server"> 
    <div id="wrapper"> 
    <%-- 1st set of ASP controls --%> 
     <div id="Main" runat="server"> 
     <%-- 2nd set ASP of controls --%> 
     </div> 
    </div> 
<form> 

我的代碼看起來是這樣的:

For Each c As Control In Page.Controls 
    For Each ctrl As Control In c.Controls 
     'disabling controls 
    Next 
Next 

我想在我的所有網頁使用此功能,請你能不能讓我知道如何來遍歷是RUNAT =「服務器」的div?

回答

3

你想要做的是禁用/啓用作爲頁面子項的控件,還控制作爲頁面子項的控件的子項。 爲此,您需要使用遞歸函數。 喜歡的東西:

private void DisableChildControls(ControlCollection controls, int depthLimit) 
{ 
    if(depthLimit <= 0) 
     return; 
    foreach(var ctl in controls) 
    { 
     ctl.Enabled = false; 
     if(ctl.Controls.Count > 0) 
     { 
     DisableChildControls(ctl.Controls, --depthLimit); 
     } 
    } 
} 

在頁面加載事件調用使用開始遍歷:

if(this.Controls.Count > 0) 
    DisableChildControls(this.Controls, 2); //If you want the depth to be two levels. 

到了極限,你指定這將recursivly禁用控制下的樹。 只要考慮到對於複雜頁面,此遞歸操作可能需要相當長的時間。

另外請注意,是好還是壞,這不僅會通過控制環標有runat="server"

+0

謝謝你,我根據我對你的代碼的解決方案有很多人真的幫助! – SalemRady

+0

@SalemRady - 太棒了!我的榜樣讓我很開心。 –

+0

@SalemRady - 爲完整性添加了深度限制參數。我以爲你也可能對實施感興趣。 –