Как найти элемент управления из набора элементов управления рекурсивно? - PullRequest
0 голосов
/ 13 ноября 2018

Мой элемент управления " MyTextBox1 " добавляется динамически в форму form1 под элементом управления container1. Эта form1 может быть дочерней по отношению к form2, а form2 может быть дочерней по отношению к form3 и так далее. Как мне найти свой элемент управления из коллекции нескольких элементов управления?

например. MyTextBox1 существует в

form3.form2.form1.Container1.MyTextBox1

как найти мой элемент управления по имени из нескольких коллекций элементов управления?

Я не хочу использовать рекурсивную коллекцию управления foreach. Я ищу умный / короткий код, такой как control.Find ().

1 Ответ

0 голосов
/ 13 ноября 2018

Если вы не хотите ставить рекурсивный , вы можете попробовать BFS (поиск в ширину);давайте реализуем его как метод расширения :

public static class ControlExtensions { 
  public static IEnumerable<Control> RecoursiveControls(this Control parent) {
    if (null == parent)
      throw new ArgumentNullException(nameof(parent));

    Queue<Control> agenda = new Queue<Control>(parent.Controls.OfType<Control>());

    while (agenda.Any()) {
      yield return agenda.Peek();

      foreach (var item in agenda.Dequeue().Controls.OfType<Control>())
        agenda.Enqueue(item);
    }
  }
}

Тогда вы можете использовать его как

// Let's find Button "MyButton1" somewhere on MyForm 
// (not necessary directly, but may be on some container)
Button myBytton = MyForm
  .RecoursiveControls()
  .OfType<Button>()
  .FirstOrDefault(btn => btn.Name == "MyButton1");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...