C# 循环浏览webform上的所有文本框和下拉控件并禁用它们

C# 循环浏览webform上的所有文本框和下拉控件并禁用它们,c#,webforms,C#,Webforms,这个有点麻烦。我想循环浏览Web表单上的每个文本框和下拉控件,并在特定条件下禁用它们。我发现了很多winforms的示例代码,但很明显,在Web表单中,您不能使用Control.Enabled,因为它不存在。我得到了这个,它(再次)不起作用,因为我使用的是网络表单: private void DisableControls(Control con) { foreach (Control c in con.Controls) { DisableControls(

这个有点麻烦。我想循环浏览Web表单上的每个文本框和下拉控件,并在特定条件下禁用它们。我发现了很多winforms的示例代码,但很明显,在Web表单中,您不能使用Control.Enabled,因为它不存在。我得到了这个,它(再次)不起作用,因为我使用的是网络表单:

private void DisableControls(Control con) 
{
    foreach (Control c in con.Controls) 
    {
        DisableControls(c);
    }
    con.Enabled = false;
}

private void EnableControls(Control con)
{
    if (con != null)
    {
        con.Enabled = true;
        EnableControls(con.Parent);
    }
}
我会在页面加载事件中调用它们,如下所示:

 protected void Page_Load(object sender, EventArgs e) 
    {
        // If certain conditions exist, then...
        DisableControls(this);
        EnableControls(Button1);
    }

为什么要使用递归?我不明白那部分

您可以使您的方法通用

private void DisableControls<T>(IEnumerable<T> controls) where T: Control
{
    foreach(var control in controls)
    {
        control.Enabled = false;
    }
}
private void DisableControls(IEnumerable controls),其中T:Control
{
foreach(控件中的var控件)
{
control.Enabled=false;
}
}
那就叫它:

DisableControls(this.Controls.OfType<TextBox>());
DisableControls(this.Controls.OfType<ComboBox>());
DisableControls(this.Controls.OfType());
DisableControls(this.Controls.OfType());

您可以使用助行器:

public void ApplyToAllControls(Control node, Action<Control> lambda)
{
   lambda(node);

   foreach(Control c in node.Controls)
   {
       ApplyToAllControls(c, lambda);
   }
}
然后通过以下方式调用它们:

ApplyToAllControls(root, ControlDisabler);
ApplyToAllControls(root, ControlEnabler);
当然有一些粗糙的边缘你可以平滑,但你应该已经得到了基本的想法

使用Curry,您甚至可以参数化lambda,但这有点远。

private void DisableControls()
private void DisableControls() 
{
    var Controls = this.Controls.OfType<TextBox>();
    foreach (Control c in Controls) 
    {
       ((TextBox)c).Enabled = false;
    }

}

private void EnableControls()
{
    var Controls = this.Controls.OfType<TextBox>();
    foreach (Control c in Controls) 
    {
       ((TextBox)c).Enabled = true;

    }
}
{ var Controls=this.Controls.OfType(); foreach(控件中的控件c) { ((文本框)c).Enabled=false; } } 私有void启用控件() { var Controls=this.Controls.OfType(); foreach(控件中的控件c) { ((文本框)c).Enabled=true; } }
您可以使用的最快解决方案是更改

private void DisableControls(Control con)
致:

这应该行得通, 当然,在循环中也要这样做

现在的解释是,类控件没有对Enabled的定义,它是在上层基类(WebControl)中定义的,所以这就是为什么需要使用它来访问Enabled

编辑:

刚刚检查了代码,它在新行的文本控件上失败(它直接从控件继承)

因此,您需要添加的唯一其他内容如下:

private void ControlDisabler(Control c)
{
    if(c != Button1)
    {
        c.Enabled = false;
    }
}

private void ControlEnabler(Control c)
{
    if(c != Button1)
    {
        c.Enabled = true;
    }
}
foreach (WebControl con in form1.Controls.OfType<WebControl>())
        {
            con.Enabled = false;
        }
foreach(表单1.Controls.OfType()中的WebControl con)
{
con.Enabled=false;
}

我不知道是否要手动导入所有控件。但是我使用了我把我想要有条件地启用/禁用的所有控件放在一起。在代码隐藏中,我只是将Pane1.Enabled=false,或true,并在运行中禁用/启用面板中的所有控件。错误13“T”不包含“Enabled”的定义,并且找不到接受类型为“T”的第一个参数的扩展方法“Enabled”(是否缺少using指令或程序集引用?)是的,我注意到添加,我们应该添加一个约束。我已经更新了我的答案检查。我没有拒绝你,但你应该将你的答案更改为有效的或删除它@Selman22i没有启用控件,您甚至说您注意到了它。不,它不会启用它。根本没道理?!!?查看您引用的控件可能不在Web命名空间下?错误13“System.Web.UI.control”不包含“Enabled”的定义,并且找不到接受“System.Web.UI.control”类型的第一个参数的扩展方法“Enabled”(是否缺少using指令或程序集引用?)@约翰尼·博恩斯:你们知道,若你们按照回答的方式结束这个问题,那个么这很好。你们知道,有人帮助你们,你们可以表示感激。
foreach (WebControl con in form1.Controls.OfType<WebControl>())
        {
            con.Enabled = false;
        }