0

この 2 つのコードによって、パネル上にあるコントロールを反復処理できます

       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(); void 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 の答えが最も簡単で、最小限のコーディングしか必要としないと思います。最良の方法は、パネル上の特定のタイプのすべてのコントロールを、それらがどのようにネストされていても見つけることができることです (ユーザー内にユーザー コントロールがある場合を想像してください)。コントロール)。

FindControlsLB の回答からソリューションにメソッドをそのままコピーし、パネルのコントロールをループする必要がある場合は、次のようにします。

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 に答える