循环浏览选项卡控件中的文本框

本文关键字:文本 控件 浏览 选项 循环 | 更新日期: 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++;
    }
} 

但这只通过表单上的文本框我也找到了这个答案,但是我还没有设法让它工作:循环浏览文本框顶部答案会导致许多错误:

  1. 不允许对非泛型声明进行约束
  2. 找不到类型或命名空间名称"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)
      }
 }