以c#形式收集控件

本文关键字:控件 | 更新日期: 2023-09-27 18:30:10

我有一个表单,其中有一些按钮。我想把它们的引用放在一个数组中。前臂有可能吗?

我想这样做:

    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++;
}

但我不能在Form上使用前臂。如果按钮在面板中也是一样的。

如何快速收集所有按钮?感谢:)

以c#形式收集控件

您正在寻找表单或容器的Controls集合,它直接包含其中的每个控件。

注意,这也将包括非按钮;调用CCD_ 2进行过滤。

因此,您可以初始化一个数组,而不是foreach:

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

每个Control都有一个Controls属性,该属性是ControlCollection。您可以在Control(作为FormPanel)上获得所有Button,如下所示:

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

但这只会给您直接包含在该control中的Button。如果您想在allPanels、GroupBoxs等上的Form中获得所有Buttons,则需要像本例中那样通过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 }
    }
}