【问题标题】:How do I disable all controls in ASP.NET page?如何禁用 ASP.NET 页面中的所有控件?
【发布时间】:2023-04-10 01:34:01
【问题描述】:

我在一个页面中有多个下拉列表,如果用户选择了一个显示全部禁用的复选框,我想禁用所有。到目前为止,我有这段代码,但它不起作用。有什么建议吗?

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

【问题讨论】:

    标签: c# webforms asp.net-controls


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      每个控件都有子控件,因此您需要使用递归来访问它们:

      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
      

      【讨论】:

      • 谢谢!我想关闭表单上的所有按钮/文本框/组合框,除了一个,禁用面板会禁用所有控件,因此它不起作用。使用你的方法,我可以只关闭我想要的控件,但不能关闭面板。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        这是一个 VB.NET 版本,它还带有一个可选参数,因此它也可以用于启用控件。

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

        【讨论】:

          【解决方案5】:

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

          ASPX:

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

          代码隐藏:

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

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

          【讨论】:

            【解决方案6】:

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

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

            Page_Load 内部:

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

            ... 或 C# 等价物。 :o)

            【讨论】:

              【解决方案7】:
                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 库。

              【讨论】:

                【解决方案8】:

                我知道这是一篇旧帖子,但这就是我刚刚解决这个问题的方法。根据标题“如何禁用 ASP.NET 页面中的所有控件?”我使用反射来实现这一点;它适用于所有具有 Enabled 属性的控件类型。只需调用传入父控件(即 Form)的 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
                

                【讨论】:

                • 这是最好的解决方案,因为它会禁用任何具有“已启用”属性的控件。我当前的项目可以在某个字段集中有各种自定义控件,只禁用某些已知类型是很难看的。
                • 非常适合我!谢谢。
                【解决方案9】:

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

                【讨论】:

                  猜你喜欢
                  • 2014-06-21
                  • 2010-09-16
                  • 2011-01-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-02-11
                  相关资源
                  最近更新 更多