2009-11-05 4 views
6

Come si costruisce un array di pulsanti in un'applicazione Winforms?Come si crea una matrice di pulsanti C#?

Quello che sto cercando di fare è questo: ho molti pulsanti in una sorta di calendario, che indicano intervalli di tempo. IE: Monday0700Button, Monday0730Button, Monday0800Button e così via a intervalli di 30 minuti.

Ho un database xml, dove uno dei campi per gli appuntamenti è <Duration> Quando la durata è = 0.5 ore, e il campo <Time> è uguale a "07:00 am", per colorare il "Monday0700Button". Quando la Durata è 1.0 ore, voglio che compaia 'Monday0700Button' così come il seguente pulsante dell'ora di 'Monday0730Button'.

Qualche idea? Grazie.

+3

Non interamente correlato alla domanda, ma guardando avanti un po ', si potrebbe voler dare un'occhiata a http: //www.devexpress.it/Prodotti/NET/Controls/WinForms/Scheduler /, da utilizzare come pianificatore di calendario invece di scriverne uno, ne ricaverai molto di più per un minore sforzo – RC1140

+0

+1 stalkerh: Usiamo quel controllo (beh l'intera azienda suite) dove lavoro con ottimi risultati. Non potrei raccomandarlo abbastanza. –

risposta

5

Sì, è possibile creare un elenco di pulsanti come di seguito.

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

Penso che la tua risposta potrebbe essere incompleta. Un elenco di oggetti pulsante è inutile a meno che i pulsanti non possano essere visualizzati e utilizzati in un modulo. Come si collegano gli eventi a ciascun pulsante? –

+0

@Robert Harvey: in questo esempio, è necessario aggiungere i gestori di eventi in modo programmatico. – FrustratedWithFormsDesigner

+3

Dovrai fare di meglio per ottenere il mio upvote. –

3

Sì, non è un problema costruire una serie di pulsanti o qualsiasi oggetto. Non sarete in grado di vederli nella finestra di progettazione di Visual Studio, ma funzioneranno perfettamente.

Molto tempo fa, ho utilizzato una serie di pulsanti 2D per creare l'interfaccia utente per un'app per calcolatrice. Avevo usato un HP-15C per molto tempo, e l'ho perso.

alt text

L'approccio matrice funzionava bene.

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

Quando faccio questo, ottengo un errore di runtime non appena raggiunge foreach (var b in numberButtons) b.Click + = new System.EventHandler (this.Number_Click); – user1747567

0

I pulsanti, come tutti gli elementi della GUI, sono oggetti come qualsiasi altro (che può anche essere visualizzato). Quindi sì, puoi avere matrici, elenchi, dizionari, qualunque cosa tu voglia contenere i pulsanti. Taylor L's response ha qualche codice di esempio.

0

Sì, questo è possibile, come ha dimostrato Taylor L. L'unico problema è che gli array di controllo in stile VB6, creati copiando e incollando il controllo, non possono più essere eseguiti nell'editor di moduli.

3

Sì, sicuramente possibile, ma probabilmente non necessario.

Se ho capito bene, dovresti essere in grado di aggiungere un FlowLayoutPanel al tuo Modulo e quindi eseguire il ciclo attraverso il tuo XML, istanziando un nuovo pulsante, se necessario. Collegare il gestore eventi per l'evento Click, quindi aggiungere il pulsante a FlowLayoutPanel chiamando il metodo Add() fuori dalla proprietà Controls sul proprio 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); 
} 

Mentre un FlowLayoutPanel rende facile fare il layout per i pulsanti, potrebbe non funzionare per voi. In questo caso, dovrai calcolare le coordinate X e Y per i pulsanti mentre esegui il ciclo dell'XML.

Un problema che si incontrerà con l'approccio sopra è che chiama sempre lo stesso stesso gestore di eventi. Di conseguenza, dovrai trovare un modo per determinare quale pulsante è stato cliccato. Un approccio potrebbe essere quello di estendere il controllo Button per fornire proprietà aggiuntive che possono essere utilizzate per riconoscere il periodo di tempo.