Foreach迭代不迭代文本框

时间:2014-08-20 12:41:58

标签: c# foreach textbox iteration

我已经制作了一个检查所有文本框的方法,并告诉我是否有空文本框。当我调试它并完成代码时,它只是完全跳过foreach循环。

这是我的代码:

private bool checkSolved()
{
    bool isSolved = true; //Solve Variable
    foreach (TextBox tb in this.Controls.OfType<TextBox>()) //Iterates through all textboxes
    {
       if (tb.Text == null) //Checks to see if one of them is null
       {
          isSolved = false; //Sets bool to false
       }
    }
    return isSolved; //Returns bool
}

3 个答案:

答案 0 :(得分:2)

您需要递归搜索。此外,TextBox.Text永远不会返回null,该属性会返回""。此扩展程序返回给定类型lazily的所有控件:

public static IEnumerable<T> GetChildControlsRecursive<T>(this Control root) where T: Control
{
    if (root == null) throw new ArgumentNullException("root");
    var stack = new Stack<Control>();
    stack.Push(root);
    while (stack.Count > 0)
    {
        Control parent = stack.Pop();
        foreach (Control child in parent.Controls)
        {
            if (child is T)
                yield return (T) child;
            stack.Push(child);
        }
    }
    yield break;
}

现在您可以使用此代码检查所有TextBox是否都有文本:

var textBoxes = this.GetChildControlsRecursive<TextBox>();
bool isSolved = textBoxes.All(txt => !string.IsNullOrEmpty(txt.Text));

答案 1 :(得分:0)

TextBox.Text永远不会为空。您需要将其与Empty进行比较。使用string.IsNullOrEmpty方法。

if (string.IsNullOrEmpty(tb.Text))
{

}

如果它根本没有执行循环,那么您的Controls集合中没有任何TextBox

Edit1:调试的一些提示:

如果你无法完成这项工作,很可能你的文本框不会被this(你的控件在这里)作为父级。它将被添加到其他一些父母。它可以是PanelGroupBox等。在这种情况下,访问this.Controls无效,您需要访问respectiveParent.Controls集合。你这样做like this recursively

答案 2 :(得分:0)

    public static List<T> GetAllControlsInside<T>(Control control)
    {
        List<Control> result = new List<Control>();
        GetAllControlsInside<T>(control, result);
        return result.OfType<T>().ToList();
    }

    private static void GetAllControlsInside<T>(Control control, List<Control> result)
    {
        foreach (Control ctrl in control.Controls)
        {
            result.Add(ctrl);
            if (ctrl.HasChildren && !(ctrl is T))
            {
                GetAllControlsInside<T>(ctrl, result);
            }
        }
    }


private bool checkSolved()
{
    bool isSolved = true; //Solve Variable
    foreach (TextBox tb in GetAllControlsInside<TextBox>(this)) //Iterates through all textboxes
    {
       if (String.IsNullOrEmpty(tb.Text)) //Checks to see if one of them is null
       {
          isSolved = false; //Sets bool to false
       }
    }
    return isSolved; //Returns bool
}