У меня есть ASP.Net MasterPage с элементом PlaceHolder.Содержимое PlaceHolder можно просматривать в двух режимах: чтение-запись и только чтение.
Чтобы реализовать только чтение, я хотел отключить все входы внутри PlaceHolder.
Я решил сделать эторекурсивно просматривая коллекцию элементов управления PlaceHolder, находя все те, которые наследуются от WebControl, и устанавливая control.Enabled = false;
.
Вот то, что я первоначально написал:, и все элементы управления отключены ... Но затем требование изменилось;)
СЕЙЧАС, мы хотим отключить все элементы управления кроме , которые имеют определенный класс 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 на Panel, и он получаетотключен.Затем он перебирает дочерние элементы и вызывает DisableControls для DropDownList и оставляет его включенным (как и предполагалось).Однако, поскольку панель отключена, при отображении страницы все, что находится внутри тега <div>
, отключено!
Можете ли вы придумать способ обойти это?Я думал об изменении c.GetType().IsSubclassOf(typeof(WebControl))
на c.GetType().IsSubclassOf(typeof(SomeParentClassThatAllInputElementsInheritFrom))
, но не могу найти ничего подходящего!