0

我可以通过这两个代码遍历面板上的控件

       Form4 fl = new Form4();
       StringBuilder sb = new StringBuilder();
       foreach (Control c in panel1.Controls)
       {
           if (c is ComboBox)
           {
               ComboBox cb = (ComboBox)c;
               sb.Append(cb.Text);
               fl.comboBox1.Text = sb.ToString();
               fl.Show();
           }

       } 

或通过此列表 lst = new List(); 无效 GetComboBoxValues()

    StringBuilder sb = new StringBuilder();
    {
      sb.Append(c.Text + "\r\n");
    }
   MessageBox.Show(sb.ToString());
     }

但是我添加了一个面板,并在面板上添加了一个包含组合框和文本框的用户控件,如何找到控件并添加到字符串生成器,所以我想遍历用户控件并找到文本并将其添加到字符串生成器,是吗可能的?

4

2 回答 2

2

您可以使用此递归方法来查找控件

var combos = FindControls<ComboBox>(panel1).ToList();

或者

var text = String.Join(Environment.NewLine, 
                       FindControls<ComboBox>(this).Select(c => c.Text));

IEnumerable<T> FindControls<T>(Control ctrl) where T : Control
{
    foreach (Control c in ctrl.Controls)
    {
        if (c.GetType() == typeof(T)) yield return (T)c;
        foreach (var subC in FindControls<T>(c))
            yield return subC;
    }
}

- - - - - - - - -编辑 - - - - - - - - -

你能建议最简单的方法吗

List<ComboBox> combos = new List<ComboBox>();
FindComboBoxes(this,combos);
StringBuilder sb = new StringBuilder();
foreach (var combo in combos)
{
    sb.AppendLine(combo.Text);
}

void FindComboBoxes(Control parent,List<ComboBox> fillThis) 
{
    foreach (Control c in parent.Controls)
    {
        if (c.GetType() == typeof(ComboBox)) fillThis.Add((ComboBox)c);
        FindComboBoxes(c, fillThis);
    }
}
于 2012-12-16T14:34:01.490 回答
1

回应留给LB答案的评论。就我个人而言,我认为 LB 的答案是最简单的并且需要最少的编码,最好的事情是它会在面板上找到特定类型的所有控件,无论它们是多么嵌套(想象一下,如果你在用户内部有一个用户控件控制)。

只需将 LB 的答案中的方法原样复制FindControls到您的解决方案中,在您需要循环访问面板控件的地方,执行以下操作:

StringBuilder sb = new StringBuilder();
var comboBoxes = FindControls<ComboBox>(panel1).ToList();
var textBoxes = FindControls<TextBox>(panel1).ToList();

foreach (var comboBox in comboBoxes)
    sb.AppendLine(comboBox.SelectedItem.ToString());

foreach (var textbox in textBoxes)
    sb.AppendLine(textbox.Text);

MessageBox.Show(sb.ToString());

一个简单的例子是这样的,但请注意,如果您在用户控件中有用户控件的情况,它将不起作用,所以我强烈建议使用 LB 的示例:

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < panel1.Controls.Count; i++)
    {
        if (panel1.Controls[i].Controls.Count > 0)
        {
            //Iterate through the controls in the user control
            foreach(Control c in panel1.Controls[i].Controls)
            {
            }
        }
        else
        {
            //Handle the controls with no children
        }
    }
于 2012-12-16T15:05:17.473 回答