Выборочное отключение элементов WebControl - PullRequest
1 голос
/ 07 января 2011

У меня есть 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)), но не могу найти ничего подходящего!

1 Ответ

2 голосов
/ 07 января 2011

Вы хотите отключить только элементы управления вводом, поэтому ваш код слишком общий. Сделайте что-то вроде этого:

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, которое бы идентифицировало его как элемент управления вводом, но таких типов не так много, так что делать это не должно быть слишком большим.

...