2016-01-12 3 views
0

У меня есть форма, в которой есть несколько кнопок. Я хотел бы разместить их ссылки в массиве. Возможно ли это с помощью foreach?Соберите элементы управления в форме C#

Я хочу, чтобы это сделать:

public Form1() 
    { 
     InitializeComponent(); 
     Button[] all = new Button[5]; 
     all[0] = button1; 
     all[1] = button2; 
     all[3] = button3; 
     all[4] = button4; 
    } 

Я уже пробовал

int i=0; 
foreach (Button p in Form1) 
{ 
    all[i]= p; 
    i++; 
} 

Но я не могу использовать Еогеасп на бланке. То же самое, если кнопки находятся в панели.

Что я могу сделать, чтобы быстро собрать все кнопки? Спасибо :)

+1

WinForms? WebForms? ASP.NET MVC? WPF? SilverLight? –

+0

Простейшим способом, вероятно, будет 'Form1.Controls.OfType

+0

Вам нужно будет выполнить итерацию коллекции this.Controls. И скрестите пальцы, чтобы они были в том порядке, в котором вы хотите. Ясно, что нет ничего плохого в том, чтобы делать это явно. Используйте синтаксис инициализатора, чтобы сделать его более конденсированным. И объявите переменную правильно, она бесполезна как локальная переменная вашего конструктора. –

ответ

2

Вы ищете коллекцию Controls вашей формы или контейнера, в которой содержится каждый элемент управления, непосредственно в нем.

Опасайтесь, что это также будет включать в себя кнопки без кнопок; звоните .OfType<Button>() для фильтрации.

Так вместо Еогеасп вы можете инициализировать массив так:

Button[] all = this.Controls.OfType<Button>().ToArray(); 
+0

Спасибо :) lucky не имеет значения, порядок в массиве :) – Nikolas

1

Каждый Control имеет Controls свойство, которое является ControlCollection. Вы можете получить все Button сек на Control (как Form или в Panel), как это:

foreach(var button in control.Controls.OfType<Button>()) 
{ ... } 

Но это только даст вам Button S, которые содержатся непосредственно этим control. Если вы хотите получить все Button s в ваших Form на всехPanel с, GroupBox s и т.д., вам необходимо рекурсию через Controls как в этом примере:

public class Form1 : Form 
{ 
    // ... 

    private static IEnumerable<Button> GetAllButtons(Control control) 
    { 
     return control.Controls.OfType<Button>().Concat(control.Controls.OfType<Control>().SelectMany(GetAllButtons)); 
    } 

    private void DoSomethingWithAllButtons() 
    { 
     foreach(var button in GetAllButtons(this)) 
     { // do something with button } 
    } 
} 
+0

Спасибо :) lucky не имеет значения, порядок в массиве :) – Nikolas

Смежные вопросы