2009-11-05 13 views
6

Jak utworzyć tablicę przycisków w aplikacji WinForm?Jak utworzyć C# Array of Buttons?

Co próbuję zrobić, to: Mam wiele przycisków w układzie kalendarza, które wskazują przedziały czasowe. IE: Monday0700Button, Monday0730Button, Monday0800Button itd. W odstępach 30-minutowych.

Mam bazę danych xml, gdzie jedno z pól dla spotkań to <Duration> Kiedy czas = 0,5 godz., A pole <Time> jest równe "07:00", aby pokolorować "Monday0700Button". Kiedy czas trwania wynosi 1.0hrs, chcę, aby zapełnił on "Monday0700Button", a także następujący przycisk przedziału czasowego "Monday0730Button".

Wszelkie pomysły? Dzięki.

+3

Nie jest to w pełni związane z pytaniem, ale tylko trochę przed sobą, możesz zajrzeć na http: //www.devexpress.com/Produkty/NET/Controls/WinForms/Scheduler /, do użycia jako planer kalendarza zamiast pisania własnego, dostaniesz o wiele więcej za mniej wysiłku – RC1140

+0

+1 stalkerh: Używamy tej kontroli (dobrze całe przedsiębiorstwo suite), w którym pracuję z doskonałymi wynikami. Nie można go wystarczająco polecić. –

Odpowiedz

5

Tak, możesz zbudować listę przycisków, jak poniżej.

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

Myślę, że twoja odpowiedź może być niekompletna. Lista obiektów przycisku jest bezużyteczna, chyba że przyciski mogą być wyświetlane i używane w formularzu. W jaki sposób można przypiąć zdarzenia do każdego przycisku? –

+0

@Robert Harvey: w tym przykładzie programowanie zdarzeń musiałoby zostać dodane programowo. – FrustratedWithFormsDesigner

+3

Musisz zrobić to lepiej, aby uzyskać przewagę. –

3

Tak, nie ma problemu, aby zbudować tablicę Przycisków lub dowolnego obiektu. Nie będzie można ich zobaczyć w projektancie Visual Studio, ale będą działać dobrze.

Dawno temu użyłem dwuwymiarowej tablicy przycisków do zbudowania interfejsu dla aplikacji kalkulatora. Używałem HP-15C przez długi czas i tęskniłem za tym.

alt text

Podejście Tablica działało.

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

Gdy to zrobię, pojawia się błąd runtime, gdy tylko osiągnie foreach (var b w numberButtons) b.Click + = new System.EventHandler (this.Number_Click); – user1747567

0

Przyciski, podobnie jak wszystkie elementy GUI, są obiektami podobnymi do wszystkich innych (które można również wyświetlić). Więc tak, możesz mieć tablice, listy, słowniki - cokolwiek chcesz zawierać przyciski. Taylor L's response ma przykładowy kod.

0

Tak, jest to możliwe, jak wykazał Taylor L. Jedynym haczykiem jest to, że tablice kontrolne w stylu VB6, utworzone przez skopiowanie i wklejenie kontrolki, nie mogą być już wykonywane w edytorze formularzy.

3

Tak, zdecydowanie możliwe, ale prawdopodobnie niepotrzebne.

Jeśli dobrze Cię rozumiem, powinieneś móc dodać do formularza formularz FlowLayoutPanel, a następnie przepuścić przez XML, tworząc nowy przycisk, jeśli to konieczne. Połącz procedurę obsługi zdarzeń Click, a następnie dodaj przycisk do FlowLayoutPanel, wywołując metodę Add() z właściwości Controls w swoim 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); 
} 

Choć FlowLayoutPanel ułatwia zrobić układ do przycisków, to nie może pracować dla Ciebie. Jeśli tak jest, musisz obliczyć współrzędne X i Y dla twoich przycisków podczas przechodzenia przez XML.

Jednym z problemów, które można napotkać w powyższym podejściu, jest to, że zawsze wywołuje dokładnie ten sam moduł obsługi zdarzeń. W rezultacie będziesz musiał wymyślić sposób, aby określić, który przycisk został kliknięty. Jednym z podejść może być rozszerzenie kontrolki Button, aby zapewnić dodatkowe właściwości, które można wykorzystać do potwierdzenia czasu.