如何禁用ASP.NET页面中的所有控件?

我在页面中有多个下拉列表,并且如果用户选择一个禁用全部的复选框,则要禁用所有。 到目前为止,我有这个代码,它无法正常工作。 有什么建议?

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

每个控件都有子控件,因此您需要使用递归来实现所有控件:

 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 

我知道这是一个老post,但这就是我刚刚解决了这个问题的方法。 根据标题“如何禁用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 

如果您在面板中放置要禁用的所有控件,然后启用/禁用面板,这将是最简单的。

在要禁用的页面部分周围放置一个面板:

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

在Page_Load里面:

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

……或者C#等价物。 :O)

我正在使用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); 

你必须递归,我的意思是你必须禁用控件的子控件:

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

这是一个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 
  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 aproach。 使用devExpress时,您必须包含DevExpress.Web.ASPxEditors lib。

如果您确实要禁用页面上的所有控件,那么最简单的方法是将表单的Disabled属性设置为true。

ASPX:

  
...

代码隐藏:

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

但当然,这也会禁用您的复选框,因此您将无法单击该复选框以重新启用控件。