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

时间:2013-09-20 16:50:03

标签: c# .net winforms tabs textbox

我有一个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 最佳答案会导致一些错误:

  
      
  1. 非通用声明不允许使用约束
  2.   
  3. 找不到类型或命名空间名称'TControl'
  4.   

我是使用C#的新手,我不太确定如何解决第一个错误。如果有帮助,我使用的是Visual Studio 2008和.NET 3.5 有什么建议吗?

3 个答案:

答案 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)
      }
 }