foreach Control ctrl в SomePanel.Controls не получает все элементы управления - PullRequest
4 голосов
/ 13 мая 2010

У меня есть панель с кучей ярлыков и текстовых полей внутри нее.

код:

foreach (Control ctrl in this.pnlSolutions.Controls)

Кажется, только найти html-таблицу внутри панели и 2 литранала. Но он не получает текстовые поля, которые находятся в таблице HTML. Существует ли простой способ получения всех элементов управления внутри панели независимо от вложенности ?

спасибо!

Ответы [ 5 ]

8 голосов
/ 13 мая 2010

Вот ленивое решение:

public IEnumerable<Control> GetAllControls(Control root) {
  foreach (Control control in root.Controls) {
    foreach (Control child in GetAllControls(control)) {
      yield return child;
    }
  }
  yield return root;
}

Помните также, что некоторые элементы управления хранят внутреннюю коллекцию элементов (например, ToolStrip), и она не будет перечислять их.

4 голосов
/ 13 мая 2010

Вам нужно было бы рекурсивно «переходить» через элементы управления, думать об этом, как обойти структуру папок.

есть образец Здесь

2 голосов
/ 07 мая 2015

У меня была именно та проблема, которая указана в вопросе, так что это может кому-то помочь. Я пытался очистить контрольную коллекцию перед тем, как переписать ее.

private void clearCollection(Control.ControlCollection target)
{
    foreach (Control Actrl in target)
    {
        if (Actrl is Label || Actrl is Button)
        {
            target.Remove(Actrl);
        }
    }
 }

При удалении элемента управления внутри цикла foreach он должен связываться с внутренними указателями, в результате чего элементы управления в коллекции пропускаются. Моим решением было найти все элементы управления, а затем удалить их в отдельном цикле.

private void clearCollection(Control.ControlCollection target)
    {
        List<Control> accumulator = new List<Control>();

        foreach (Control Actrl in target)
        {
            if (Actrl is Label || Actrl is Button)
            {
                accumulator.Add(Actrl);  // find all controls first. 
            }
        }

        for (int i = 0; i < accumulator.Count; i++)
        {
            target.Remove(accumulator[i]);
        }
    }
2 голосов
/ 13 мая 2010

Насколько я знаю, вы должны сами выполнить рекурсию, но это не очень сложно.

Эскиз (не проверен):

void AllControls(Control root, List<Control> accumulator)
{
    accumulator.Add(root);
    foreach(Control ctrl in root.Controls)
    {
        AllControls(ctrl, accumulator);
    }
}
1 голос
/ 13 мая 2010

Причина в том, что единственными элементами управления, которые являются прямыми дочерними элементами вашей панели, являются таблица и литералы, которые вы упоминаете, и только эти 100 * * возвращают.

Текстовые поля меток являются дочерними элементами управления таблицы, что делает их внуками панели.

Как указывает @Yoda, вам нужно рекурсивно пройтись по элементам управления, чтобы найти их все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...