2009-11-05 7 views
6

Wie erstelle ich ein Array von Schaltflächen in einer Winforms-Anwendung?Wie erstelle ich ein C# Array von Schaltflächen?

Was ich versuche zu tun ist das: Ich habe viele Knöpfe in einer Art Kalenderanordnung, die Zeitfenster anzeigen. IE: Monday0700Button, Monday0730Button, Monday800Button usw. in 30min-Intervallen.

Ich habe eine XML-Datenbank, wo eines der Felder für Termine ist <Duration> Wenn die Dauer = 0.5hrs, und die <Time> Feld ist gleich "07:00 Uhr", um die "Monday0700Button" zu färben. Wenn die Dauer 1,0 Stunden beträgt, möchte ich, dass sie "Monday0700Button" sowie die folgende Zeitschlitzschaltfläche von "Monday0730Button" auffüllt.

Irgendwelche Ideen? Danke.

+3

Nicht ganz auf die Frage bezogen, sondern nur ein wenig vorausschauend, möchten Sie vielleicht einen Blick auf http: //www.devexpress werfen.com/Produkte/NET/Controls/WinForms/Scheduler /, um als Kalenderplaner zu verwenden, anstatt Ihre eigenen zu schreiben, erhalten Sie viel mehr davon für weniger Aufwand – RC1140

+0

+1 stalkerh: Wir verwenden diese Kontrolle (und das ganze Unternehmen Suite), wo ich mit einigen tollen Ergebnissen arbeite. Ich kann es nicht genug empfehlen. –

Antwort

5

Ja, Sie können eine Liste von Schaltflächen wie unten erstellen.

+1

Ich denke, Ihre Antwort könnte unvollständig sein. Eine Liste von Schaltflächenobjekten ist nutzlos, wenn die Schaltflächen nicht in einem Formular angezeigt und verwendet werden können. Wie verbindet man Ereignisse mit jedem Knopf? –

+0

@Robert Harvey: In diesem Beispiel müssten Sie die Ereignishandler programmatisch hinzufügen. – FrustratedWithFormsDesigner

+3

Sie müssen besser als das, um meine Aufzählung zu bekommen. –

3

Ja, es ist kein Problem, ein Array von Schaltflächen oder einem Objekt zu erstellen. Sie können sie im Visual Studio Designer nicht sehen, aber sie funktionieren einwandfrei.

Vor langer Zeit habe ich ein 2-D-Array von Schaltflächen verwendet, um die Benutzeroberfläche für eine Taschenrechner-App zu erstellen. Ich hatte eine HP-15C für eine lange Zeit verwendet und es verpasst.

alt text

Das Array Ansatz funktionierte gut.

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

Wenn ich dies tue, erhalte ich einen Laufzeitfehler, sobald er foreach (var b in numberButtons) b.Click + = new System.EventHandler (this.Number_Click); – user1747567

0

Schaltflächen, wie alle GUI-Elemente, sind Objekte wie alle anderen (die auch angezeigt werden können). Also ja, Sie können Arrays, Listen, Wörterbücher haben - was immer Sie möchten, Schaltflächen enthalten. Taylor L's response hat einige Beispielcode.

0

Ja, das ist möglich, wie Taylor L gezeigt hat. Der einzige Haken ist, dass Steuerarrays im VB6-Stil, die durch Kopieren und Einfügen des Steuerelements erstellt wurden, nicht mehr im Formulareditor ausgeführt werden können.

3

Ja, definitiv möglich, aber wahrscheinlich unnötig.

Wenn ich Sie richtig verstehe, sollten Sie in der Lage sein, eine FlowLayoutPanel zu Ihrem Formular hinzufügen und dann durchlaufen Sie Ihre XML, Instanziierung eines neuen Button, wie nötig. Verknüpfen Sie den Ereignishandler für das Click-Ereignis und fügen Sie dann die Schaltfläche zum FlowLayoutPanel hinzu, indem Sie die Add() - Methode in der Eigenschaft Controls in Ihrem FlowLayoutPanel aufrufen.

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

Während ein Flowlayoutpanel macht es einfach, das Layout für Ihre Tasten zu tun, ist es vielleicht nicht für Sie arbeiten. Wenn dies der Fall ist, müssen Sie die X- und Y-Koordinaten für Ihre Schaltflächen ausarbeiten, während Sie das XML durchlaufen.

Ein Problem, das Sie mit dem obigen Ansatz auftreten werden, ist, dass es immer den genau gleichen Ereignishandler aufruft. Als Ergebnis müssen Sie einen Weg finden, um festzustellen, welche Schaltfläche geklickt wurde. Ein Ansatz könnte darin bestehen, das Button-Steuerelement zu erweitern, um zusätzliche Eigenschaften bereitzustellen, mit denen der Zeitraum bestätigt werden kann.

Verwandte Themen