我有一个winforms应用程序,它必须从不同选项卡和面板中的50个文本框中提取文本。到目前为止,我一直无法找到有用的东西。 我试过了:
foreach (Control x in this.Controls)
{
if (x is NumericTextBox)
{
s = i.ToString() + ", " + ((NumericTextBox)x).Text;
Append_to_Template_File(s);
i++;
}
}
但这只是通过表单上的文本框 我也找到了这个答案,但是我没有设法让它起作用: Loop through Textboxes 最佳答案会导致一些错误:
- 非通用声明不允许使用约束
- 找不到类型或命名空间名称'TControl'
醇>
我是使用C#的新手,我不太确定如何解决第一个错误。如果有帮助,我使用的是Visual Studio 2008和.NET 3.5 有什么建议吗?
答案 0 :(得分:3)
您可以使用这样的方法遍历整个控制树,而不仅仅是顶层,以便一直向下移动所有控件:
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);
答案 1 :(得分:3)
类似于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 =新列表();
findall(this,ref l);
答案 2 :(得分:0)
递归是你的朋友!
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)
}
}