从现有按钮创建按钮的数组(集合)

时间:2010-10-27 21:02:44

标签: c# collections

是否有一种从表单上现有按钮创建按钮集合的简单方法? (在c#中)。

我的表单上已经有一系列按钮,我想使用索引来访问它们......例如:

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

可以这样做吗?

编辑:我可以将数组设置为具有通用的OnClick事件吗?然后确定点击了阵列中的哪个按钮,比如改变它的颜色?

8 个答案:

答案 0 :(得分:6)

LINQ救援!!

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

答案 1 :(得分:3)

var myButtonArray = new [] {this.Button1, this.Button2, ...}

如果有很多按钮,为简化此过程,您可以在表单级别尝试此代码:

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

你可以使用控件集合中任何具有非空控件集合的控件来解决这个问题。

答案 2 :(得分: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 };

答案 3 :(得分:1)

类似的东西:

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

答案 4 :(得分:1)

您拥有表单的Controls属性中的所有控件,因此您必须迭代该集合并将其添加到您的数组中。

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

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

答案 5 :(得分:1)

如果您使用的是C#7.0或更高版本,则可以在循环浏览它们时使用is关键字来检查每个控件是否为按钮。

List<Button> buttons = new List<Button>();//CREATE LIST FOR BUTTONS

//LOOP THROUGH EACH CONTROL ON FORM
foreach (Control c in Controls)
{
    //IF THE CONTROL IS A BUTTON ADD IT TO THE LIST
    if (c is Button b)
    {
        buttons.Add(b);
    }
}

有关C#的较早版本,请参见@ Edgar Hernandezanswer

答案 6 :(得分:0)

假设有一个命名约定......

List<Button> asdf = new List<Button>();
for (int x = 0; x <= 10; x++) {
    asdf.Add(myButton + x);
}

答案 7 :(得分: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;
}