2010-10-27 2 views
1

Есть ли простой способ создания коллекции кнопок из существующих кнопок в моей форме? (В C#).Создать массив (набор) кнопок из существующих кнопок

У меня есть ряд кнопок, уже на моей форме, и я хочу использовать индекс для доступа к ним ... например .:

myButtonArray[0].ForeColor ...// Do something with it 

Можно ли это сделать?

Редактировать: Можно ли установить массив для общего события OnClick? А затем определить, какая кнопка в массиве была нажата и, скажем, изменить цвет?

ответ

1

Вы можете сделать это так же, как и для любого другого массива. Например:

Button[] array = { firstButton, secondButton }; 

или, если вам нужно объявить в одном месте и назначить позже:

Button[] array; 
... 
array = new Button[] { firstButton, secondButton }; 

В C# 3+ можно использовать неявную типизацию инициализаторов массива:

Button[] array; 
... 
array = new[] { firstButton, secondButton }; 

Возможно, вы также захотите рассмотреть вопрос об использовании List<Button>:

List<Button> buttons = new List<Button> { firstButton, secondButton }; 
1

что-то вроде:

var myButtonArray = new[] {btn1, btn2, btn3, btn4}; 
6

LINQ на помощь !!

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

С другой стороны, то вы понятия не имеете, какой из них есть что. Он также не найдет кнопки, которые находятся в панелях и т. Д. –

+0

Хорошо, мне это нравится. –

+0

Это, безусловно, хороший момент. К счастью для меня, требования не говорят, что внутри панелей есть кнопки. :) – Bryan

0

Предполагая, что существует соглашение об именовании ...

List<Button> asdf = new List<Button>(); 
for (int x = 0; x <= 10; x++) { 
    asdf.Add(myButton + x); 
} 
3
var myButtonArray = new [] {this.Button1, this.Button2, ...} 

Чтобы упростить этот процесс, если есть много кнопок, вы можете попробовать этот код на уровне формы:

this.Controls.OfType<Button>().ToArray(); 

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

0

У вас есть все элементы управления в свойстве Элементы управления формы, поэтому вам нужно итерировать эту коллекцию и добавить ее в свой массив.

List<Button> buttons = new List<Button>(); 

foreach(Control c in this.Controls) 
{ 
    Button b = c as Button; 
    if(b != null) 
    { 
     buttons.Add(b); 
    } 
} 
0

In response to your requirements: (Edit: Can I set the array to have a generic OnClick event? And then determine which button in the array was clicked and, say, change its color?)

List<Button> buttons = new List<Button> { firstButton, secondButton }; 

// Iterate through the collection of Controls, or you can use your List of buttons above. 
foreach (Control button in this.Controls) 
{ 
    if (button.GetType() == typeof(Button)) // Check if the control is a Button. 
    { 
     Button btn = (Button)button; // Cast the control to Button. 
     btn.Click += new System.EventHandler(this.button_Click); // Add event to button. 
    } 
} 

// Click event for all Buttons control. 
private void button_Click(Button sender, EventArgs e) 
{ 
    ChangeForeColor(sender); // A method that accepts a Button 
    // other methods to do... 
    // you can also check here what button is being clicked 
    // and what action to do for that particular button. 
    // Ex: 
    // 
    // switch(sender.Name) 
    // { 
    //  case "firstButton": 
    //   sender.ForeColor = Color.Blue; 
    //   break; 
    //  case "secondButton ": 
    //   sender.Text = "I'm Button 2"; 
    //   break; 
    // } 
} 

// Changes the ForeColor of the Button being passed. 
private void ChangeForeColor(Button btn) 
{ 
    btn.ForeColor = Color.Red; 
} 
Смежные вопросы