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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/505353/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-04 06:00:25  来源:igfitidea点击:

How do I disable all controls in ASP.NET page?

c#webformsasp.net-controls

提问by Mohamed

I have multiple dropdownlist in a page and would like to disable all if user selects a checkbox which reads disable all. So far I have this code and it is not working. Any suggestions?

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

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

采纳答案by John Sheehan

Each control has child controls, so you'd need to use recursion to reach them all:

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

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

        DisableControls(c, State);
    }
}

Then call it like so:

然后像这样调用它:

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

回答by bechbd

It would be easiest if you put all the controls you want to disable in a panel and then just enable/disable the panel.

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

回答by Canavar

You have to do this recursive, I mean you have to disable child controls of controls to :

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

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

回答by Canavar

Here's a VB.NET version which also takes an optional parameter so it can be used for enabling the controls as well.

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

Private Sub SetControls(ByVal parentControl As Control, Optional ByVal enable As Boolean = False)

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

回答by M4N

If you really want to disable allcontrols on a page, then the easiest way to do this is to set the form's Disabled property to true.

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

ASPX:

ASPX:

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

Code-behind:

代码隐藏:

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

But of course, this will also disable your checkbox, so you won't be able to click the checkbox to re-enable the controls.

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

回答by Tom English

Put a panel around the part of the page that you want disabled:

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

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

Inside of Page_Load:

Page_Load 内部:

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

... or the C# equivalent. :o)

...或等效的 C#。:o)

回答by Coderx07

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

I use a linq aproach. While using devExpress you must include DevExpress.Web.ASPxEditors lib.

我使用 linq 方法。使用 devExpress 时,您必须包含 DevExpress.Web.ASPxEditors 库。

回答by Justin Clarke

I know this is an old post but this is how I have just solved this problem. AS per the title "How do I disable all controls in ASP.NET page?" I used Reflection to achieve this; it will work on all control types which have an Enabled property. Simply call DisableControls passing in the parent control (I.e., Form).

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

C#:

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:

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

回答by dnxit

I was working with ASP.Net and HTML controls I did like this

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

called like this

这样叫

DisableForm(Page.Controls);