当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何禁用ASP.NET页面中的所有控件?》经验,为你挑选了4个好方法。

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

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

John Sheehan.. 38

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

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


Justin Clark.. 29

我知道这是一个老帖子,但这就是我刚刚解决了这个问题的方法.根据标题"我如何禁用ASP.NET页面中的所有控件?" 我用反射来达到这个目的; 它适用于具有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

这是最佳解决方案,因为它禁用任何具有"Enabled"属性的控件.我当前的项目可以在某个字段集中包含各种自定义控件,仅禁用某些已知类型是很难看的. (2认同)


bechbd.. 19

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



1> John Sheehan..:

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

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



2> Justin Clark..:

我知道这是一个老帖子,但这就是我刚刚解决了这个问题的方法.根据标题"我如何禁用ASP.NET页面中的所有控件?" 我用反射来达到这个目的; 它适用于具有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


这是最佳解决方案,因为它禁用任何具有"Enabled"属性的控件.我当前的项目可以在某个字段集中包含各种自定义控件,仅禁用某些已知类型是很难看的.

3> bechbd..:

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



4> 小智..:

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

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

在Page_Load里面:

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

......或C#等价物.:O)

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有