c# - mvc - ¿Cómo desactivo todos los controles en la página ASP.NET?
web forms c# ejemplos (9)
Sería más fácil si coloca todos los controles que desea desactivar en un panel y luego simplemente habilita / deshabilita el panel.
Tengo una lista desplegable múltiple en una página y me gustaría deshabilitar todo si el usuario selecciona una casilla de verificación que dice deshabilitar todo. Hasta ahora tengo este código y no está funcionando. ¿Alguna sugerencia?
foreach (Control c in this.Page.Controls)
{
if (c is DropDownList)
((DropDownList)(c)).Enabled = false;
}
Tienes que hacer esto recursivo, quiero decir que tienes que deshabilitar los controles secundarios de los controles para:
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;
}
}
}
Aquí hay una versión de VB.NET que también toma un parámetro opcional para que pueda usarse también para habilitar los controles.
Private Sub SetControls (ByVal parentControl As Control, Opcional 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 realmente desea deshabilitar todos los controles en una página, la forma más fácil de hacerlo es establecer la propiedad Deshabilitado del formulario en verdadero.
ASPX:
<body>
<form id="form1" runat="server">
...
</form>
</body>
Código detrás:
protected void Page_Load(object sender, EventArgs e)
{
form1.Disabled = true;
}
Pero, por supuesto, esto también desactivará su casilla de verificación, por lo que no podrá hacer clic en la casilla de verificación para volver a habilitar los controles.
Coloque un panel alrededor de la parte de la página que desea deshabilitar:
< asp:Panel ID="pnlPage" runat="server" >
...
< /asp:Panel >
Dentro de Page_Load:
If Not Me.Page.IsPostBack Then
Me.pnlPage.Enabled = False
End If
... o el equivalente de C #. : o)
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;
}
Yo uso un enfoque lineal. Mientras usa devExpress, debe incluir DevExpress.Web.ASPxEditors lib.
Cada control tiene controles secundarios, por lo que necesitaría usar la recursión para alcanzarlos a todos:
protected void DisableControls(Control parent, bool State) {
foreach(Control c in parent.Controls) {
if (c is DropDownList) {
((DropDownList)(c)).Enabled = State;
}
DisableControls(c, State);
}
}
Entonces llámalo así:
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
Sé que esta es una publicación anterior, pero así es como acabo de resolver este problema. AS por el título "¿Cómo desactivo todos los controles en la página ASP.NET?" Usé Reflection para lograr esto; funcionará en todos los tipos de control que tengan una propiedad habilitada. Simplemente llame a DisableControls pasando el control padre (es decir, formulario).
DO#:
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
Estaba trabajando con los controles ASP.Net y HTML Me gustó esto
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);
}
}
llamado así
DisableForm(Page.Controls);