Как отключить все элементы управления на странице ASP.NET? - PullRequest
20 голосов
/ 03 февраля 2009

У меня есть несколько выпадающих списков на странице, и я хотел бы отключить все, если пользователь выбирает флажок, который читает отключить все. Пока у меня есть этот код, и он не работает. Есть предложения?

foreach (Control c in this.Page.Controls)
{
    if (c is DropDownList)
        ((DropDownList)(c)).Enabled = false;
}

Ответы [ 9 ]

37 голосов
/ 03 февраля 2009

Каждый элемент управления имеет дочерние элементы управления, поэтому вам нужно использовать рекурсию, чтобы достичь их всех:

protected void DisableControls(Control parent, bool State) {
    foreach(Control c in parent.Controls) {
        if (c is DropDownList) {
            ((DropDownList)(c)).Enabled = State;
        }

        DisableControls(c, State);
    }
}

Тогда назовите это так:

protected void Event_Name(...) {
    DisableControls(Page,false); // use whatever top-most control has all the dropdowns or just the page control
} // divs, tables etc. can be called through adding runat="server" property
29 голосов
/ 09 апреля 2013

Я знаю, что это старый пост, но я только что решил эту проблему. Как указано в заголовке «Как отключить все элементы управления на странице ASP.NET?» Я использовал Reflection, чтобы достичь этого; он будет работать на всех типах элементов управления, имеющих свойство Enabled. Просто вызовите DisableControls, передав родительский элемент управления (т. Е. Форму).

C #:

private void DisableControls(System.Web.UI.Control control)
{
    foreach (System.Web.UI.Control c in control.Controls) 
    {
        // Get the Enabled property by reflection.
        Type type = c.GetType();
        PropertyInfo prop = type.GetProperty("Enabled");

        // Set it to False to disable the control.
        if (prop != null) 
        {
            prop.SetValue(c, false, null);
        }

        // Recurse into child controls.
        if (c.Controls.Count > 0) 
        {
            this.DisableControls(c);
        }
    }
}

VB:

    Private Sub DisableControls(control As System.Web.UI.Control)

        For Each c As System.Web.UI.Control In control.Controls

            ' Get the Enabled property by reflection.
            Dim type As Type = c.GetType
            Dim prop As PropertyInfo = type.GetProperty("Enabled")

            ' Set it to False to disable the control.
            If Not prop Is Nothing Then
                prop.SetValue(c, False, Nothing)
            End If

            ' Recurse into child controls.
            If c.Controls.Count > 0 Then
                Me.DisableControls(c)
            End If

        Next

    End Sub
19 голосов
/ 03 февраля 2009

Было бы проще, если бы вы поместили все элементы управления, которые вы хотите отключить, на панель, а затем просто включили / отключили панель.

8 голосов
/ 30 октября 2012

Поместите панель вокруг той части страницы, которую вы хотите отключить:

   < asp:Panel ID="pnlPage" runat="server" >
      ...
   < /asp:Panel >

Внутри Page_Load:

   If Not Me.Page.IsPostBack Then
      Me.pnlPage.Enabled = False
   End If

... или эквивалент C #. : О)

2 голосов
/ 29 августа 2014

Я работал с ASP.Net и элементами управления HTML, мне это понравилось

public void DisableForm(ControlCollection ctrls)
    {
        foreach (Control ctrl in ctrls)
        {
            if (ctrl is TextBox)
                ((TextBox)ctrl).Enabled = false;
            if (ctrl is Button)
                ((Button)ctrl).Enabled = false;
            else if (ctrl is DropDownList)
                ((DropDownList)ctrl).Enabled = false;
            else if (ctrl is CheckBox)
                ((CheckBox)ctrl).Enabled = false;
            else if (ctrl is RadioButton)
                ((RadioButton)ctrl).Enabled = false;
            else if (ctrl is HtmlInputButton)
                ((HtmlInputButton)ctrl).Disabled = true;
            else if (ctrl is HtmlInputText)
                ((HtmlInputText)ctrl).Disabled = true;
            else if (ctrl is HtmlSelect)
                ((HtmlSelect)ctrl).Disabled = true;
            else if (ctrl is HtmlInputCheckBox)
                ((HtmlInputCheckBox)ctrl).Disabled = true;
            else if (ctrl is HtmlInputRadioButton)
                ((HtmlInputRadioButton)ctrl).Disabled = true;

            DisableForm(ctrl.Controls);
        }
    }

называется так

DisableForm(Page.Controls);
1 голос
/ 04 декабря 2012
  private void ControlStateSwitch(bool state)
{
    foreach (var x in from Control c in Page.Controls from Control x in c.Controls select x)
        if (ctrl is ASPxTextBox)

            ((ASPxTextBox)x).Enabled = status;

        else if (x is ASPxDateEdit)

            ((ASPxDateEdit)x).Enabled = status;
}

Я использую подход linq. При использовании devExpress вы должны включить DevExpress.Web.ASPxEditors lib.

1 голос
/ 10 февраля 2009

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

Private Sub SetControls (ByVal parentControl As Control, необязательный ByVal enable As Boolean = False)

    For Each c As Control In parentControl.Controls
        If TypeOf (c) Is CheckBox Then
            CType(c, CheckBox).Enabled = enable
        ElseIf TypeOf (c) Is RadioButtonList Then
            CType(c, RadioButtonList).Enabled = enable
        End If
        SetControls(c)
    Next

End Sub
1 голос
/ 03 февраля 2009

Вы должны сделать это рекурсивно, я имею в виду, что вы должны отключить дочерние элементы управления:

protected void Page_Load(object sender, EventArgs e)
{
  DisableChilds(this.Page);
}

private void DisableChilds(Control ctrl)
{
   foreach (Control c in ctrl.Controls)
   {
      DisableChilds(c);
      if (c is DropDownList)
      {
           ((DropDownList)(c)).Enabled = false;
      }
    }
}
0 голосов
/ 10 февраля 2009

Если вы действительно хотите отключить все элементы управления на странице, то самый простой способ сделать это - установить для свойства Disabled формы значение true.

ASPX:

<body>
    <form id="form1" runat="server">
      ...
    </form>
</body>

Код-за:

protected void Page_Load(object sender, EventArgs e)
{
    form1.Disabled = true;
}

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

...