试图寻找替代foreach的方法

时间:2013-11-21 13:19:03

标签: c# foreach

我正在尝试编写一个公共函数,它可以调用我的所有页面,以便在插入数据后清除所有文本框。我这样用过它:

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的公共函数。

有人可以建议替代方案吗?

6 个答案:

答案 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;
}