Как создать массив кнопок C#?

Как создать массив кнопок в приложении WinForms?

то, что я пытаюсь сделать, это: у меня есть много кнопок в своего рода календарь, который показывает время. IE: Monday0700Button, Monday0730Button, Monday0800Button, и так далее в интервалах 30min.

у меня есть база данных xml, где одним из полей для встреч является <Duration> когда продолжительность = 0.5 hrs, и <Time> поле равно "07: 00am", чтобы цвет 'Monday0700Button'. Когда продолжительность 1.0 hrs, я хочу, чтобы он заполнял "Monday0700Button", а также следующую кнопку временного слота "Monday0730Button".

какие идеи? Спасибо.

5 ответов


Да, вы можете создать список кнопок, как показано ниже.

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

Да, нет проблем с построением массива кнопок или любого объекта. Вы не сможете увидеть их в конструкторе Visual studio, но они будут работать нормально.

давным-давно я использовал 2-D массив кнопок для создания пользовательского интерфейса для приложения калькулятора. Я долгое время использовал HP-15C и пропустил его.

alt text

подход массива работал нормально.

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

Да, определенно возможно, но, вероятно, ненужно.

Если я правильно вас понимаю, вы должны иметь возможность добавить FlowLayoutPanel в форму, а затем цикл через XML, создавая экземпляр новой кнопки, по мере необходимости. Подключите обработчик событий для события Click, затем добавьте кнопку в FlowLayoutPanel, вызвав метод Add () из свойства Controls в 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 делает его легким к сделайте макет для своих кнопок, это может не сработать для вас. Если это так, вам нужно будет разработать координаты X и Y для ваших кнопок, когда вы просматриваете XML.

одна проблема, с которой вы столкнетесь с вышеуказанным подходом, заключается в том, что он всегда вызывает один и тот же обработчик событий. В результате, вам придется придумать способ, чтобы определить, какая кнопка была нажата. Одним из подходов может быть расширение элемента управления Button для предоставления дополнительных свойств, которые могут быть используется для подтверждения периода времени.


кнопки, как и все элементы GUI, являются объектами, как и любые другие (которые также могут отображаться). Так что да, у вас могут быть массивы, списки, словари - все, что вы хотите, содержащие кнопки. ответ имеет некоторый пример кода.


Да, это возможно,как продемонстрировал Тейлор л. Единственная загвоздка в том, что массивы управления в стиле VB6, созданные путем копирования и вставки элемента управления, больше не могут быть выполнены в Редакторе форм.