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