我已经制作了一个检查所有文本框的方法,并告诉我是否有空文本框。当我调试它并完成代码时,它只是完全跳过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
}
答案 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
(你的控件在这里)作为父级。它将被添加到其他一些父母。它可以是Panel
或GroupBox
等。在这种情况下,访问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
}