如何创建 C# 按钮数组?

Posted

技术标签:

【中文标题】如何创建 C# 按钮数组?【英文标题】:How do I create a C# Array of Buttons? 【发布时间】:2010-12-13 06:57:58 【问题描述】:

如何在 Winforms 应用程序中构建按钮数组?

我想要做的是:我有很多按日历排列的按钮,用于指示时间段。 IE:Monday0700Button、Monday0730Button、Monday0800Button 等,间隔 30 分钟。

我有一个 xml 数据库,其中约会字段之一是 <Duration> 当持续时间 = 0.5 小时,<Time> 字段等于“07:00am”时,为“Monday0700Button”着色。当 Duration 为 1.0 小时时,我希望它填充“Monday0700Button”以及“Monday0730Button”的以下时隙按钮。

有什么想法吗? 谢谢。

【问题讨论】:

与问题不完全相关,只是向前看一点,你可能想看看devexpress.com/Products/NET/Controls/WinForms/Scheduler,用作日历计划者而不是自己编写,你会得到很多事半功倍 +1 stalkerh:我们使用该控件(以及整个企业套件)在我工作的地方取得了一些很好的结果。再怎么推荐也不为过。 【参考方案1】:

是的,您可以构建一个如下所示的按钮列表。

List<Button> listOfButtons = new List<Button>();
listOfButtons.Add(yourButton);

【讨论】:

我认为您的回答可能不完整。除非可以在表单上显示和使用按钮,否则按钮对象的列表是没有用的。如何将事件连接到每个按钮? @Robert Harvey:在此示例中,您必须以编程方式添加事件处理程序。【参考方案2】:

是的,构建按钮数组或任何对象都没有问题。 您将无法在 Visual Studio 设计器中看到它们,但它们会正常工作。

很久以前,我使用二维按钮阵列来构建计算器应用程序的 UI。我已经使用 HP-15C 很长时间了,错过了它。

数组方法运行良好。

  Button[] numberButtons=new Button[]  btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btnDecimalPt;
  Button[] operationButtons=new Button[]  btnDiv, btnMult, btnSubtract, btnAdd ;

  foreach (var b in numberButtons)
       b.Click += new System.EventHandler(this.Number_Click);

  foreach (var b in operationButtons)
      b.Click += new System.EventHandler(this.Operation_Click);

  // etc

  Button[][] allButtons=
  
      new Button[] btnSqrt, btnExp, btn10x, btnPow,btnMultInverse, btnCHS, null, null, null, null, 
      new Button[] btnN, btnInterest, btnPMT, btnPV, btnFV, null, btn7, btn8, btn9, btnDiv, 
      new Button[] btnLn, btnLog, btnSine, btnCosine, btnTangent, btnPi, btn4, btn5, btn6, btnMult, 
      new Button[] btnRoll, btnSwap, btnCLRfin, btnCLX, btnCLR, btnEnter, btn1, btn2, btn3, btnSubtract, 
      new Button[] btnInt, btnFrac, btnFix, btnStore, btnRecall, null, btn0, btnDecimalPt, btnNotUsed, btnAdd
  ;

  // programmatically set the location
  int col,row;
  for(row=0; row < allButtons.Length; row++)
  
      Button[] ButtonCol= allButtons[row];
      for (col=0; col < ButtonCol.Length; col++)
      
          if (ButtonCol[col]!=null)
          
              ButtonCol[col].TabIndex = col + (row * allButtons.Length) +1;
              ButtonCol[col].Font = font1; 
              ButtonCol[col].BackColor = System.Drawing.SystemColors.ControlDark;
              ButtonCol[col].Size=new System.Drawing.Size(stdButtonWidth, stdButtonHeight);
              ButtonCol[col].Location=new Point(startX + (col * stdButtonWidth), 
                                                startY + (row * stdButtonHeight) ) ;
          
      
  

【讨论】:

当我这样做时,我会在遇到 foreach (var b in numberButtons) b.Click += new System.EventHandler(this.Number_Click);【参考方案3】:

是的,绝对有可能,但可能没有必要。

如果我对您的理解正确,您应该能够将FlowLayoutPanel 添加到您的表单中,然后循环通过您的 XML,根据需要实例化一个新按钮。连接 Click 事件的事件处理程序,然后通过调用 FlowLayoutPanel 上 Controls 属性的 Add() 方法将按钮添加到 FlowLayoutPanel。

while (reader.Reader())

    // Parse XML here

    // Instantiate a new button that will be added to your FlowLayoutPanel
    Button btn = new Button();

    // Set button properties, as necessary
    btn.Text = "Foo";
    btn.Click += new EventHandler(SomeButton_Click);

    // Add the button to the FlowLayoutPanel
    flowLayoutPanel.Controls.Add(btn);

虽然 FlowLayoutPanel 可以轻松地为您的按钮进行布局,但它可能不适合您。如果是这种情况,您必须在循环遍历 XML 时计算出按钮的 X 和 Y 坐标。

使用上述方法会遇到的一个问题是它总是调用完全相同的事件处理程序。因此,您必须想出一种方法来确定单击了哪个按钮。一种方法可能是扩展 Button 控件以提供可用于确认时间段的附加属性。

【讨论】:

【参考方案4】:

按钮,和所有的 GUI 元素一样,是和其他任何对象一样的对象(也恰好是可显示的)。所以是的,你可以拥有数组、列表、字典——任何你想要包含按钮的东西。 Taylor L 的response 有一些示例代码。

【讨论】:

【参考方案5】:

是的,这是可能的,正如 Taylor L 所证明的那样。唯一的问题是,通过复制和粘贴控件创建的 VB6 样式控件数组不能再在表单编辑器中完成。

【讨论】:

以上是关于如何创建 C# 按钮数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c# 中基于构造函数方法创建数组?

如何在 C# 中返回一个数组而不在方法内创建数组? [关闭]

C#创建2维数组

如何在 C# 中从二维矩形字符数组的一行创建字符串?

如何在 C# 中初始化一个空数组?

在 Unity 4.6 中从 C# 脚本创建 UI 按钮,无需任何预制件 [重复]