【发布时间】:2011-01-07 16:42:30
【问题描述】:
我有一个带有 PlaceHolder 元素的 ASP.Net MasterPage。 PlaceHolder 的内容可以通过两种模式查看:读写和只读。
为了实现只读,我想禁用 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:DropDownList> 的<ASP:Panel>,并且我想保持启用 DropDownList,那么这不起作用。
我在面板上调用 DisableControls,它被禁用。然后它循环遍历子项,并在 DropDownList 上调用 DisableControls,并使其保持启用状态(如预期的那样)。但是,由于 Panel 被禁用,当页面呈现时,<div> 标签内的所有内容都被禁用!
你能想办法解决这个问题吗?我曾考虑将c.GetType().IsSubclassOf(typeof(WebControl)) 更改为c.GetType().IsSubclassOf(typeof(SomeParentClassThatAllInputElementsInheritFrom)),但找不到合适的!
【问题讨论】:
标签: asp.net web-controls