向List添加大量按钮控件

时间:2018-03-03 21:34:30

标签: c# winforms button

在我的程序中,我有150个按钮。它们都被命名为button1到button150,因为它们最初是由WinForms设计者生成的。我的目标是将它们全部添加到列表中以便稍后进行处理,我宁愿不只是写一行150行来说平板电脑。添加(无论哪个)。

我尝试使用我在网络上发现的一些我不完全理解的文章中的一些代码。但是我收到了编译错误。

List<Button> tabletBtns = new List<Button>;
for (int i = 0; i >= 150; i++)
{
  var buttonName = string.Format("button{0}", i);
  var button = Controls.Find(buttonName, true);

  if (button != null)
  {
      tabletBtns.Add(button);
  }
}

感谢您的时间,感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

问题列表:

  • 编译时错误 Controls.Find |()返回一个数组,因为您可以在子用户或自定义控件中使用相同名称的控件。在您的情况下,您可以使用Find(name,false).First()来获取第一个。
  • 运行时错误 Girrafes列表不能包含Animal,即使Girraffe是动物也是如此。在你的情况下,控制是动物,按钮是长颈鹿。阅读有关协方差和逆变的信息。
  • 循环不执行任何操作您的代码中包含&gt; = 150条件。改为&lt; =。您还可以将索引设置为0而不是1。

您需要做的可能是:

List<Button> tabletBtns = new List<Button>;
for (int i = 1; i <= 150; i++)
{
    var buttonName = string.Format("button{0}", i);
    var button = Controls[buttonName] as Button; // if the buttons are all on the main canvas or Controls.Find(buttonName, true).First() as Button if they are hosted in some child custom or user controls

    if (button != null)
    {
       tabletBtns.Add(button);
    }
}

在与@JohnG离线讨论和研究后,看来他的解决方案更快,如果这对你很重要。对于名称检查,也许这样的事情将是一个开始:

var buttonsList = Controls.OfType<Button>().Where(b=> Regex.IsMatch(b.Name, @"^button(?<number>\d+)$")).ToList();
//this does not validate that the number is between 1 and 150, that is for another sleepless night :)

更好的选择是从代码而不是WinForms设计器生成和添加所有按钮。祝你好运!