对于不遍历文本框的每次迭代

本文关键字:迭代 于不 遍历 文本 | 更新日期: 2023-09-27 18:18:59

我已经做了一个方法来检查我所有的文本框,并告诉我是否有空的。当我调试它并跟踪代码时,它完全跳过了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
}

对于不遍历文本框的每次迭代

需要递归搜索。同样,TextBox.Text永远不会返回null,而是返回""。这个扩展惰性地返回给定类型的所有控件:

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都有text:

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

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

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

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

Edit1:一些调试提示:

如果你不能设法得到这个工作,最有可能你的文本框将不会被this(你的控制在这里)父级。它将被添加到其他父节点。可以是PanelGroupBox等等。在这种情况下,访问this.Controls是没有用的,你需要访问respectiveParent.Controls集合。你可以这样递归地做

    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
}