对于不遍历文本框的每次迭代
本文关键字:迭代 于不 遍历 文本 | 更新日期: 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
(你的控制在这里)父级。它将被添加到其他父节点。可以是Panel
或GroupBox
等等。在这种情况下,访问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
}