循环浏览选项卡控件中的文本框
本文关键字:文本 控件 浏览 选项 循环 | 更新日期: 2023-09-27 18:32:07
我有一个winforms应用程序,它必须从不同选项卡和面板中找到的50个文本框中提取文本。到目前为止,我一直无法找到有效的东西。我试过:
foreach (Control x in this.Controls)
{
if (x is NumericTextBox)
{
s = i.ToString() + ", " + ((NumericTextBox)x).Text;
Append_to_Template_File(s);
i++;
}
}
但这只通过表单上的文本框我也找到了这个答案,但是我还没有设法让它工作:循环浏览文本框顶部答案会导致许多错误:
- 不允许对非泛型声明进行约束
- 找不到类型或命名空间名称"TControl"
我是使用 C# 的新手,我不太确定如何解决第一个错误。如果有帮助,我正在使用Visual Studio 2008和.NET 3.5。有什么建议吗?
您可以使用如下方法遍历整个控件树,而不仅仅是顶层,以一直向下获取所有控件:
public static IEnumerable<Control> GetAllChildren(Control root)
{
var stack = new Stack<Control>();
stack.Push(root);
while(stack.Any())
{
var next = stack.Pop();
foreach(Control child in next.Controls)
stack.Push(child);
yield return next;
}
}
然后,您可以筛选出所需类型的文本,并将它们映射到其文本值:
var lines = GetAllChildren(form)
.OfType<NumericTextBox>()
.Select((textbox, i) => string.Format("{0}, {1}", i, textbox.Text));
foreach(var line in lines)
Append_to_Template_File(line);
类似于Servy的想法。 这是另一个实现;)
下面的函数获取一个控件作为参数,并返回其中所有文本框的列表作为 ref 参数 l;
void findall(Control f, ref List<Control> l) {
foreach (Control c in f.Controls) {
if (c is TextBox)
l.Add(c);
if (c.HasChildren)
findall(c, ref l);
}
}
你可以这样称呼它
列表 l = 新列表();
查找所有(这,参考文献 L);
递
归是你的朋友!
private void DoThings()
{
MyFunc(this.Controls);
}
private void MyFunc(Control.ControlCollection controls)
{
foreach (Control x in this.Controls)
{
if (x is NumericTextBox)
{
s = i.ToString() + ", " + ((NumericTextBox)x).Text;
Append_to_Template_File(s);
i++;
}
if (x.HasChildren)
MyFunc(x.Controls)
}
}