2011-01-07 50 views
1

我有一個帶有PlaceHolder元素的ASP.Net母版頁。 可以在兩種模式下查看PlaceHolder的內容:讀寫和只讀。選擇性地禁用WebControl元素

要實現只讀,我想禁用PlaceHolder中的所有輸入。
我決定通過循環遍歷PlaceHolder的控件集合,找到所有從WebControl繼承的設置,並設置control.Enabled = false;

這是我原來寫:

private void DisableControls(Control c) 
{ 
    if (c.GetType().IsSubclassOf(typeof(WebControl))) 
    { 
     WebControl wc = c as WebControl; 
     wc.Enabled = false; 
    } 

    //Also disable all child controls. 
    foreach (Control child in c.Controls) 
    { 
     DisableControls(child); 
    } 
} 

這工作得很好,所有的控件被禁用...但隨後的需求變化;)
現在,我們要禁止所有控件除了者其中有一定的CssClass。

所以,我在新版本的第一次嘗試:

private void DisableControls(Control c) 
{ 
    if (c.GetType().IsSubclassOf(typeof(WebControl))) 
    { 
     WebControl wc = c as WebControl; 
     if (!wc.CssClass.ToLower().Contains("someclass")) 
      wc.Enabled = false; 
    } 

    //Also disable all child controls. 
    foreach (Control child in c.Controls) 
    { 
     DisableControls(child); 
    } 
} 

現在,我已經打了一個問題。如果我有(例如)<ASP:Panel>其中包含一個<ASP:DropDownList>,並且我想保持啓用DropDownList,那麼這是行不通的。

我在面板上調用DisableControls,並且它被禁用。然後它通過子節點循環,並在DropDownList上調用DisableControls,並將其保持爲啓用狀態(如預期的那樣)。但是,由於面板被禁用,當頁面呈現時,<div>標記內的所有內容都被禁用!

你能想出一個辦法嗎?我想過把c.GetType().IsSubclassOf(typeof(WebControl))更改爲c.GetType().IsSubclassOf(typeof(SomeParentClassThatAllInputElementsInheritFrom)),但我找不到任何合適的東西!

回答

2

你只想禁用輸入控件,所以你的代碼太籠統。做這樣的事情:

if (IsInputControl(wc) && !wc.CssClass.ToLower().Contains("someclass")) 
      wc.Enabled = false; 

,並創建功能IsInputControl:

bool isInputControl(WebControl ctl) { 
    if (ctl is TextBox || 
     ctl is DropDownList || 
     ctl is CheckBox || 
     ...) { 
     return true; 
    } else { 
     return false; 
    } 
} 

我不知道的WebControl將其標識爲輸入控制,雖然任何一般財產,但目前還沒有很多類型,所以它不應該太大這麼做。

+0

是的,我想過做這樣的事情......我的擔心是要獲得正確/完整的類型列表。如果我能找到一個更通用的方法來發現「輸入」元素,那麼我會去做。如果沒有,那麼我會將你的標記作爲答案:) – NeilD 2011-01-07 17:04:28