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