我正在尝试编写一个公共函数,它可以调用我的所有页面,以便在插入数据后清除所有文本框。我这样用过它:
public void clean(Control parent)
{
try
{
foreach (Control c in parent)
{
TextBox tb = c as TextBox; //if the control is a textbox
tb.Text = String.Empty; //display nothing
}
}
catch (Exception ex)
{
Console.WriteLine("{0} Exception caught.", ex);
}
}
然而,foreach提出错误说
“无法对变量类型system.web.ui.control进行操作,因为它不包含getenumerator的公共函数。
有人可以建议替代方案吗?
答案 0 :(得分:7)
<强>解决方案强>
您希望迭代parent
的子控件,因此请使用:
foreach (Control c in parent.Controls)
{
//Do Stuff
}
<强>建议强>
我还建议检查Control是否也是TextBox
...
TextBox tb = c as TextBox;
if(tb != null)//Will be null if c is not a TextBox
{
tb.Text = String.Empty;
}
OR
if(c is TextBox)//Check if c is TextBox before using it
{
TextBox tb = c as TextBox;
tb.Text = String.Empty;
}
(参见有关良好讨论的评论以及两种方法之间差异的链接)
答案 1 :(得分:5)
我使用OfType扩展方法仅过滤TextBoxes。你的工作不起作用,因为你无法枚举Control
通常需要IEnumerable
(不是必需的)。
foreach (TextBox tb in parent.Controls.OfType<TextBox>())
{
tb.Text = String.Empty;
//or
tb.Clear();
}
答案 2 :(得分:4)
那是因为Control不是可枚举的,但它确实有一个Controls属性,我认为这就是你所追求的
foreach (Control c in parent.Controls)
{
...
}
您可以制作一个有用的扩展方法,以提高可读性,例如
public static class ControlExt
{
public static IEnumerable<TextBox> TextBoxControls(this Control ctrl)
{
return ctrl.Controls.OfType<TextBox>();
}
}
...
foreach (TextBox tb in parent.TextBoxControls())
{
tb.Clear();
}
答案 3 :(得分:2)
foreach (var c in parent.Controls)
{
var tb = c as TextBox;
if (tb != null) tb.Text = string.Empty;
}
答案 4 :(得分:2)
我想你打算去:
for each(Control c in parent.Controls)
答案 5 :(得分:1)
我发布了一个解决方案here,您可以如何遍历页面上的所有TextBox。注意,这段代码是由p.campbell编写的。
public static IEnumerable<Control> FindAll(this ControlCollection collection)
{
foreach (Control item in collection)
{
yield return item;
if (item.HasControls())
{
foreach (var subItem in item.Controls.FindAll())
{
yield return subItem;
}
}
}
}
完成此操作后,您可以遍历页面上的所有文本框控件并执行操作。如下所示,您可以迭代所有类型的控件。
foreach (var t in this.Controls.FindAll().OfType<TextBox>())
{
t.Text = String.Empty;
}