Сделайте все элементы управления формы доступными только для чтения - PullRequest
7 голосов
/ 01 сентября 2010

Есть ли у кого-нибудь фрагмент кода для создания всех элементов управления (или даже всех текстовых ящиков) в форме, доступной только для чтения, без необходимости индивидуальной настройки каждого элемента управления только для чтения?

Ответы [ 7 ]

6 голосов
/ 01 сентября 2010

Напишите метод расширения, который собирает элементы управления и дочерние элементы управления указанного типа:

public static IEnumerable<T> GetChildControls<T>(this Control control) where T : Control
{
    var children = control.Controls.OfType<T>();
    return children.SelectMany(c => GetChildControls<T>(c)).Concat(children);
}

Соберите текстовые поля в форме (используйте TextBoxBase, чтобы повлиять на RichTextBox и т. Д. - решение @ Тимви):

IEnumerable<TextBoxBase> textBoxes = this.GetChildControls<TextBoxBase>();

Итерация по коллекции и настройка только для чтения:

private void AreTextBoxesReadOnly(IEnumerable<TextBoxBase> textBoxes, bool value)
{
    foreach (TextBoxBase tb in textBoxes) tb.ReadOnly = value;
}

Если хотите - используйте кэширование - решение @ igor

5 голосов
/ 01 сентября 2010

В форме:

if (_cached == null)
{
    _cached = new List<TextBox>();

    foreach(var control in Controls)
    {
        TextBox textEdit = control as TextBox;
        if (textEdit != null)
        {
            textEdit.ReadOnly = false;
            _cached.Add(textEdit);
        }
    }
} 
else
{
    foreach(var control in _cached)
    {            
        control .ReadOnly = false;
    }
}

Также добавьте рекурсию (элементы управления можно поместить в другие элементы управления (панели)).

4 голосов
/ 01 сентября 2010

Вы должны написать себе служебную функцию для этого. Вы можете перебирать элементы управления формы, а затем рекурсивно проверять дочерние элементы управления каждого элемента. Например:

public static void SetEnableOnAllControls(Control parentControl, bool enable)
{
    parentControl.Enabled = enable;
    foreach (Control control in parentControl.Controls)
        SetEnableOnAllControls(control, enable);
}

[...]

// inside your form:
SetEnableOnAllControls(this, false);

Это не относится к ToolStrip s, которые не контролируются. Вы можете написать отдельный, похожий метод для тех.

Обратите внимание, что приведенное выше также отключает саму форму. Если вы этого не хотите, попробуйте следующее:

public static void SetEnableOnAllChildControls(Control parentControl, bool enable)
{
    foreach (Control control in parentControl.Controls)
    {
        control.Enabled = enable;
        SetEnableOnAllChildControls(control, enable);
    }
}

Если вы действительно имели в виду свойство ReadOnly , которое относится только к TextBoxes , попробуйте следующее:

public static void SetReadOnlyOnAllControls(Control parentControl, bool readOnly)
{
    if (parentControl is TextBoxBase)
        ((TextBoxBase) parentControl).ReadOnly = readOnly;
    foreach (Control control in parentControl.Controls)
        SetReadOnlyOnAllControls(control, readOnly);
}
2 голосов
/ 02 августа 2011

Я бы использовал отражение, чтобы проверить, имеет ли универсальный объект Control свойство Enabled.

private static void DisableControl(Control control)
{
    PropertyInfo enProp = control.GetType().GetProperty("Enabled");
    if (enProp != null)
    {
        enProp.SetValue(control, false, null);
    }

    foreach (Control ctrl in control.Controls)
    {
        DisableControl(ctrl);
    }
}
2 голосов
/ 01 сентября 2010

Я не проверял это, но оно должно работать:

foreach (var textBox in this.Controls.OfType<TextBox>())
    textBox.ReadOnly = true;

Редактировать: Кажется, это не очень хорошее решение: см. Комментарий Тимви.

2 голосов
/ 01 сентября 2010
this.Enabled = false;

Зависит от того, что вы делаете на самом деле, вы можете подумать о том, чтобы поместить элемент управления в панель и отключить его.

0 голосов
/ 29 сентября 2017

Я только что разработал рекурсивное решение, которое обрабатывает любой вид веб-управления, используя простой статический метод и полиморфизм ASP.NET.

/// <summary>
/// Handle "Enabled" property of a set of Controls (and all of the included child controls through recursivity)
/// By default it disable all, making all read-only, but it can also be uset to re-enable everything, using the "enable" parameter 
/// </summary>
/// <param name="controls">Set of controls to be handled. It could be the entire Page.Controls set or all of the childs of a given control (property "Controls" of any Control-derived class)</param>
/// <param name="enable">Desired value of the property "enable" of each control. </param>
public static void DisableControls(ControlCollection controls, bool enable = false)
{
    foreach (Control control in controls)
    {
        var wCtrl = control as WebControl;
        if (wCtrl != null)
        {
            wCtrl.Enabled = enable;
        }

        if (control.Controls.Count > 0)
            DisableControls(control.Controls, enable);
    }
}

/// <summary>
/// Enable a set of Controls (and all of the included child controls through recursivity).
/// Friendly name for DisableControls(controls, true), that achieve the same result.
/// </summary>
/// <param name="Controls">Set of controls to be handled. It could be the entire Page.Controls set or all of the childs of a given control (property "Controls" of any Control-derived class)</param>
public static void EnableControls(ControlCollection controls)
{
    DisableControls(controls, true);
}

Это тестируется и выглядит довольно быстро (менее чем за миллисекунду ввеб-форму с 25 + элементами управления, которые будут отключены).

Если вы предпочитаете метод расширения, я думаю, этого должно быть достаточно, чтобы изменить решение следующим образом:

public static void DisableControls(this Control control, bool enable = false)
{
    foreach (Control ctrl in control.Controls)
    {
        var wCtrl = ctrl as WebControl;
        if (wCtrl != null)
        {
            wCtrl.Enabled = enable;
        }

        if (ctrl.Controls.Count > 0)
            ctrl.DisableControls(enable);
    }
}

public static void EnableControls(this Control control)
{
    control.DisableControls(true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...