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