C # Заполните массив всеми кнопками, используемыми в форме Windows - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь заполнить массив всеми Button s, используемыми в Form1.

Button[] ButtonArray = new Button[5];

ButtonArray[0] = button1;   
ButtonArray[1] = button2;   
ButtonArray[2] = button3;   
ButtonArray[3] = button4;   
ButtonArray[4] = button5;

Этот код работает нормально.Но если у меня есть, например, кнопки 100 , это долгая процедура.

Ответы [ 4 ]

0 голосов
/ 17 мая 2018

Enumerable.OfType не выполняет поиск элементов управления в иерархии элементов управления.Поэтому, если вы хотите найти элементы управления рекурсивно, вы можете использовать этот метод расширения:

public static IEnumerable<T> RecursiveControlsOfType<T>(this Control rootControl) where T : Control
{
    foreach (Control child in rootControl.Controls)
    {
        if (child is T targetControl)
            yield return targetControl;
        foreach (T targetControlChild in child.RecursiveControlsOfType<T>())
            yield return targetControlChild;
    }
}

Использование:

Button[] nonRecursiveButtons = this.Controls.OfType<Button>().ToArray();
Button[] recursiveButtons = this.RecursiveControlsOfType<Button>().ToArray();
0 голосов
/ 17 мая 2018
List<Button> Buttons = new List<Button>();
foreach (var item in this.Controls) // Looping through all controls in the form
{
    if (item is Button) // if the current is a button we add it
    {
        Buttons.Add(item as Button);
    }
}
0 голосов
/ 17 мая 2018

Вы можете попробовать это:

ButtonArray[] buttonArray = new ButtonArray[this.Controls.OfType<Button>().Count()]
int i =0; //index for button array
foreach(var button in this.Controls.OfType<Button>()) //Iterate through each button control
{
    buttonArray [i++] = button;
}
0 голосов
/ 17 мая 2018

Если все Button в форме, вы можете попробовать использовать Linq :

using System.Linq;

...

Button[] ButtonArray = Controls
  .OfType<Button>()
  .ToArray();

Редактировать : если у вас есть несколько кнопок внутри групповые ящики , панели (т.е. не непосредственно в форме, а в каком-то контейнере ), вы должны разработать код вчто-то вроде этого

private static IEnumerable<Button> GetAllButtons(Control control) {
  IEnumerable<Control> controls = control.Controls.OfType<Control>();

  return controls
    .OfType<Button>()
    .Concat<Button>(controls
       .SelectMany(ctrl => GetAllButtons(ctrl)));
}

...

Button[] ButtonArray = GetAllButtons(this).ToArray();

См. Как получить ВСЕ дочерние элементы управления формы Windows Forms определенного типа (кнопка / текстовое поле)? для получения подробной информации

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