Цикл управления - PullRequest
4 голосов
/ 15 мая 2009

В моем коде мне нужно перебрать элементы управления в GroupBox и обрабатывать элемент управления, только если это ComboBox. Я использую код:

foreach (System.Windows.Forms.Control grpbxChild in this.gpbx.Controls)
{
    if (grpbxChild.GetType().Name.Trim() == "ComboBox")
    {
        // Process here
    }
}

У меня такой вопрос: вместо того, чтобы перебирать все элементы управления и обрабатывать только поля со списком, можно ли получить только поля со списком из GroupBox? Примерно так:

foreach (System.Windows.Forms.Control grpbxChild in this.gpbx.Controls.GetControlsOfType(ComboBox))
{
    // Process here
}

Ответы [ 5 ]

8 голосов
/ 15 мая 2009

Поскольку вы используете C # 2.0, вам почти не повезло. Вы можете написать функцию самостоятельно. В C # 3.0 вы просто делаете:

foreach (var control in groupBox.Controls.OfType<ComboBox>())
{
    // ...
}

C # 2.0 решение:

public static IEnumerable<T> GetControlsOfType<T>(ControlCollection controls)
    where T : Control
{
    foreach(Control c in controls)
        if (c is T)
            yield return (T)c;
}

который вы бы использовали как:

foreach (ComboBox c in GetControlsOfType<ComboBox>(groupBox.Controls))
{
    // ...
}
2 голосов
/ 15 мая 2009

Mehrdad совершенно прав, но ваш синтаксис (даже если вы используете C # 2.0) слишком сложен.

Я считаю, что это проще:

foreach (Control c in gpBx.Controls) 
{ 
  if (c is ComboBox) 
  { 
    // Do something.
  }
}
0 голосов
/ 17 апреля 2012
foreach (Control items in this.Controls.OfType<GroupBox>())
{
    foreach (ComboBox item in items.Controls.OfType<ComboBox>())
    {
        // your processing goes here
    }
}
0 голосов
/ 15 мая 2009
foreach (System.Windows.Forms.Control grpbxChild in this.gpbx.Controls)
{
    if (grpbxChild is ComboBox)
    {
        // Process here
    }
}
0 голосов
/ 15 мая 2009
if (!(grpbxChild is System.Windows.Forms.Combobox)) continue;

// do your processing goes here
grpbxChild.Text += " is GroupBox child";
...