在用户选择“提交”按钮后,我试图清除/重置页面上的所有文本框和下拉控件。 我想以编程方式执行此操作,因此如果稍后添加/删除其他控件,它仍然可以工作。
我已经得到了这个,其中一部分是我从另一个类似的答案中借来的:
protected void ResetAllControls()
{
foreach (Control c in this.Controls)
{
if (c is TextBox)
{
TextBox tb = (TextBox)c;
if (tb != null)
{
tb.Text = string.Empty;
}
}
if (c is DropDownList)
{
DropDownList ddl = (DropDownList)c;
ddl.SelectedIndex = -1;
}
}
}
c 解析为 System.Web.UI.LiteralControl,并且永远不会解析为 Textbox 或 DropDownList,因此它不会重置页面上的任何内容。 有人可以告诉我我错过了什么吗?
问题是页面的控件属于
LiteralControl
、HTMLHead
、HTMLForm
类型,并且 TextBox
和 DropDownList
控件是页面其他控件中的一些控件,而不是页面的直接子控件。页。例如,如果您有一个表单,并且表单内有文本框和下拉列表,但它们嵌入到表单中,并且表单嵌入到页面中,则您正在搜索的 DropDownList
和 TextBox
控件不会出现页面的控件,而是页面控件的控件。因此,您需要在控件中应用深度搜索。如果我认为控件中没有循环的想法是正确的(自 2017 年以来我就没有在 WebForms .NET 中工作过,所以至少可以说,我没有最新鲜的记忆),那么类似这样的事情应该有效:
protected void ResetAllControls(System.Web.UI.ControlCollection Controls currentControls)
{
foreach (Control c in currentControls)
{
if (c is TextBox)
{
TextBox tb = (TextBox)c;
if (tb != null)
{
tb.Text = string.Empty;
}
}
else if (c is DropDownList)
{
DropDownList ddl = (DropDownList)c;
ddl.SelectedIndex = -1;
}
else
{
ResetAllControls(c.Controls);
}
}
}
您最初通过
ResetAllControls(this.Controls);
来称呼它
如果它永远运行或抛出 stackoverflow 异常,那么您的控件之间存在循环,您将需要一些进一步的验证,而不仅仅是第三种情况的
else
。让我知道这是否适合您。