web-dev-qa-db-fra.com

Comment désactiver tous les contrôles de la page ASP.NET?

J'ai plusieurs listes déroulantes dans une page et je voudrais tout désactiver si l'utilisateur sélectionne une case à cocher qui lit tout désactiver. Jusqu'à présent, j'ai ce code et cela ne fonctionne pas. Aucune suggestion?

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

Chaque contrôle a des contrôles enfants, vous devez donc utiliser la récursivité pour les atteindre tous:

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

        DisableControls(c, State);
    }
}

Appelez-le ainsi:

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
38
John Sheehan

Je sais que c'est un vieux post mais c'est ainsi que je viens de résoudre ce problème. Selon le titre "Comment désactiver tous les contrôles de la page ASP.NET?" J'ai utilisé la réflexion pour y parvenir; cela fonctionnera sur tous les types de contrôle qui ont une propriété Enabled. Appelez simplement DisableControls en passant le contrôle parent (c'est-à-dire Form).

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
29
Justin Clarke

Ce serait plus facile si vous mettez tous les contrôles que vous souhaitez désactiver dans un panneau, puis activez/désactivez simplement le panneau.

19
bechbd

Placez un panneau autour de la partie de la page que vous souhaitez désactiver:

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

À l'intérieur de▶Load:

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

... ou l'équivalent C #. : o)

9
Tom English

Je travaillais avec des contrôles ASP.Net et HTML, j'aimais ça

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);
        }
    }

appelé comme ça

DisableForm(Page.Controls);
2
dnxit

Vous devez faire cela récursif, je veux dire que vous devez désactiver les contrôles enfants des contrôles pour:

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;
      }
    }
}
1
Canavar
  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;
}

J'utilise une approche linq. Lorsque vous utilisez devExpress, vous devez inclure la bibliothèque DevExpress.Web.ASPxEditors.

1
Coderx07

Voici une version VB.NET qui prend également un paramètre facultatif afin qu'il puisse également être utilisé pour activer les contrôles.

Private Sub SetControls (ByVal parentControl As Control, Facultatif 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
hindered

Si vous voulez vraiment désactiver tous les contrôles sur une page, la façon la plus simple de le faire est de définir le formulaire désactivé propriété à true.

ASPX:

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

Code-derrière:

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

Mais bien sûr, cela désactivera également votre case à cocher, vous ne pourrez donc pas cliquer sur la case à cocher pour réactiver les contrôles.

0
M4N