Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环浏览选项卡控件中的文本框_C#_.net_Winforms_Tabs_Textbox - Fatal编程技术网

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

C# 循环浏览选项卡控件中的文本框,c#,.net,winforms,tabs,textbox,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++;

我有一个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#是新手,我不太确定如何解决第一个错误。如果有帮助,我将使用VisualStudio2008和.NET3.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;
        }
    }
    
    公共静态IEnumerable GetAllChildren(控件根)
    {
    var stack=新堆栈();
    栈.推(根);
    while(stack.Any())
    {
    var next=stack.Pop();
    foreach(next.Controls中的控件子级)
    栈.推(子);
    其次是收益率;
    }
    }
    
    然后,您可以筛选出所需类型的文本,并将它们映射到各自的文本值:

    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);
    
    var lines=GetAllChildren(表单)
    第()类
    .Select((textbox,i)=>string.Format(“{0},{1}”,i,textbox.Text));
    foreach(行中的var行)
    将_追加到_模板_文件(行);
    
    您可以使用这样的方法遍历整个控件树,而不仅仅是顶层,以获取所有控件,一直向下:

    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;
        }
    }
    
    公共静态IEnumerable GetAllChildren(控件根)
    {
    var stack=新堆栈();
    栈.推(根);
    while(stack.Any())
    {
    var next=stack.Pop();
    foreach(next.Controls中的控件子级)
    栈.推(子);
    其次是收益率;
    }
    }
    
    然后,您可以筛选出所需类型的文本,并将它们映射到各自的文本值:

    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);
    
    var lines=GetAllChildren(表单)
    第()类
    .Select((textbox,i)=>string.Format(“{0},{1}”,i,textbox.Text));
    foreach(行中的var行)
    将_追加到_模板_文件(行);
    
    类似于服务的理念。下面是另一个实现;)

    下面的函数获取一个控件作为参数,并返回其中所有文本框的列表作为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);
            }
        }
    
    void findall(控制f,参考列表l){
    foreach(f.控件中的控件c){
    如果(c是文本框)
    l、 添加(c);
    如果(c.有子女)
    芬德尔(c,参考l);
    }
    }
    
    你可以这样称呼它

    列表l=新列表()


    findall(本文件,参考文件1)

    类似于服务的概念。下面是另一个实现;)

    下面的函数获取一个控件作为参数,并返回其中所有文本框的列表作为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);
            }
        }
    
    void findall(控制f,参考列表l){
    foreach(f.控件中的控件c){
    如果(c是文本框)
    l、 添加(c);
    如果(c.有子女)
    芬德尔(c,参考l);
    }
    }
    
    你可以这样称呼它

    列表l=新列表()


    findall(本文件,参考文件1)

    递归是你的朋友

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

    递归是你的朋友

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

    你的问题有点不清楚。
    表单
    选项卡控件
    面板
    之间的GUI关系可能会影响您获取所需控件的方式。请使您的方法递归。添加一个检查,如果x.HasChildren,如果是,则传递此方法x.Controls您的问题有一些不清楚的地方。
    表单
    选项卡控件
    面板
    之间的GUI关系可能会影响您获取所需控件的方式。请使您的方法递归。如果x.HasChildren是,则添加检查,如果是,则传递此方法x.Controls无需通过引用传递列表;这是一种引用类型。在这里复制引用就可以了。没有必要检查它是否有孩子;如果没有,foreach循环就不会做任何事情。与我的解决方案不同,在使用任何节点之前,必须先找到每个节点。这里可能不是问题,但在其他情况下可能是问题。由于需要在内存中保存所有项,因此它还消耗了大量内存(如果控件树很大)。这个解决方案也没有什么特别的优势。这个解决方案对于你要筛选的控件来说也不灵活。如果你想搜索say按钮,你需要从头开始编写一个全新的方法,因为它不是泛型的。谢谢你的评论,ref不是必需的;)我为孩子们添加了检查,以避免无用的递归调用。我可以很容易地记住递归代码,我想也许其他一些程序员更喜欢递归版本。使解决方案通用化很简单。。。感谢无需通过参考传递列表;这是一种引用类型。在这里复制引用就可以了。没有必要检查它是否有孩子;如果没有,foreach循环就不会做任何事情。与我的解决方案不同,在使用任何节点之前,必须先找到每个节点。这里可能不是问题,但在其他情况下可能是问题。由于需要在内存中保存所有项,因此它还消耗了大量内存(如果控件树很大)。这个解决方案也没有什么特别的优势。这个解决方案对于你要筛选的控件来说也不灵活。如果你想搜索say按钮,你需要从头开始编写一个全新的方法,因为它不是泛型的。谢谢你的评论,ref不是必需的;)我为孩子们添加了检查,以避免无用的递归调用。我可以很容易地记住递归代码,我想也许其他一些程序员更喜欢递归版本。使解决方案通用化很简单。。。谢谢你的解决方案。它工作得非常好。唯一的问题是生成的文本文件以文本框开头