2009-11-05 5 views
6

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

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

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

Любые идеи? Спасибо.

+3

Не совсем связанный с вопросом, а просто немного заглядывая в будущее, вы можете взглянуть на http: //www.devexpress.com/Продукты/NET/Controls/WinForms/Scheduler /, чтобы использовать в качестве планировщика календарей вместо того, чтобы писать свои собственные, вы получите больше от него за меньшее усилие. – RC1140

+0

+1 stalkerh: Мы используем этот элемент управления (ну и все это предприятие suite), где я работаю с отличными результатами. Не могу этого рекомендовать. –

ответ

5

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

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

Я думаю, что ваш ответ может быть неполным. Список объектов кнопки бесполезен, если кнопки не могут отображаться и использоваться в форме. Как подключить события к каждой кнопке? –

+0

@Robert Harvey: в этом примере вам нужно будет добавить обработчики событий программно. – FrustratedWithFormsDesigner

+3

Вам нужно будет сделать лучше, чтобы получить мое преимущество. –

3

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

Давным-давно я использовал 2-мерный массив кнопок для создания пользовательского интерфейса для приложения калькулятора. Я долгое время использовал 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)) ; 
      } 
     } 
    } 
+0

Когда я это делаю, я получаю ошибку времени выполнения, как только он попадает в foreach (var b в numberButtons) b.Click + = новый System.EventHandler (this.Number_Click); – user1747567

0

Кнопки, как и все элементы графического интерфейса пользователя, являются объектами, как и любые другие (которые также могут отображаться). Так что да, у вас могут быть массивы, списки, словари - все, что вы хотите, с кнопками. У Taylor L's response есть пример кода.

0

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

3

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

Если вы правильно поняли, вы должны добавить 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 для предоставления дополнительных свойств, которые могут использоваться для подтверждения периода времени.

Смежные вопросы