2009-11-05 8 views
6

Comment créer un tableau de boutons dans une application Winforms? Ce que j'essaye de faire est ceci: J'ai beaucoup de boutons dans une sorte d'arrangement de calendrier, qui indiquent des intervalles de temps. IE: Monday0700Button, Monday0730Button, Monday0800Button, et ainsi de suite par intervalles de 30 minutes.Comment créer un tableau de boutons C#?

J'ai une base de données XML, où l'un des champs pour les rendez-vous est <Duration> Lorsque la durée = 0.5hrs, et le champ <Time> est égal à "07:00 am", pour colorer le "Monday0700Button". Quand la durée est de 1.0hrs, je veux qu'elle remplisse 'Monday0700Button' ainsi que le bouton suivant de 'Monday0730Button'.

Des idées? Merci.

+3

Pas entièrement lié à la question mais juste un peu en avant un peu, vous pouvez jeter un oeil à http: //www.devexpress.com/Products/NET/Contrôles/WinForms/Scheduler /, à utiliser comme un planificateur de calendrier au lieu d'écrire le vôtre, vous obtiendrez beaucoup plus de lui pour moins d'effort – RC1140

+0

+1 stalkerh: Nous utilisons ce contrôle (bien l'ensemble de l'entreprise suite) où je travaille avec d'excellents résultats. Je ne peux pas le recommander assez. –

Répondre

5

Oui, vous pouvez créer une liste de boutons comme ci-dessous.

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

Je pense que votre réponse pourrait être incomplète. Une liste d'objets bouton est inutile à moins que les boutons peuvent être affichés et utilisés sur un formulaire. Comment connecter des événements à chaque bouton? –

+0

@Robert Harvey: dans cet exemple, vous devrez ajouter les gestionnaires d'événements par programme. – FrustratedWithFormsDesigner

+3

Tu devras faire mieux que ça pour obtenir mon upvote. –

3

Oui, ce n'est pas un problème pour construire un tableau de boutons, ou n'importe quel objet. Vous ne serez pas en mesure de les voir dans le concepteur Visual Studio, mais ils fonctionneront très bien.

Il y a longtemps, j'ai utilisé un tableau de boutons en deux dimensions pour créer l'interface utilisateur d'une application de calculatrice. J'avais utilisé un HP-15C pendant longtemps, et l'ai manqué.

alt text

L'approche du tableau a bien fonctionné.

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

Lorsque je fais cela, j'obtiens une erreur d'exécution dès qu'elle touche foreach (var b dans numberButtons) b.Click + = new System.EventHandler (this.Number_Click); – user1747567

0

Les boutons, comme tous les éléments de l'interface graphique, sont des objets comme les autres (qui peuvent également être affichés). Alors oui, vous pouvez avoir des tableaux, des listes, des dictionnaires - tout ce que vous voulez contenant des boutons. Taylor response de Taylor L a quelques exemples de code. Oui, c'est possible, comme Taylor L l'a démontré.

0

Le seul problème est que les tableaux de contrôle de style VB6, créés en copiant et en collant le contrôle, ne peuvent plus être effectués dans l'éditeur de formulaires.

3

Oui, certainement possible, mais probablement inutile. Si je vous ai bien compris, vous devriez pouvoir ajouter un FlowLayoutPanel à votre formulaire, puis faire une boucle dans votre fichier XML, en instanciant un nouveau bouton, si nécessaire. Câblez le gestionnaire d'événements pour l'événement Click, puis ajoutez le bouton à FlowLayoutPanel en appelant la méthode Add() de la propriété Controls sur votre 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); 
} 

Alors qu'un FlowLayoutPanel il est facile de faire la mise en page pour vos boutons, il pourrait ne pas fonctionner pour vous. Si c'est le cas, vous devrez calculer les coordonnées X et Y pour vos boutons lorsque vous bouclez le fichier XML. Un problème que vous rencontrerez avec l'approche ci-dessus est qu'il appelle toujours exactement le même gestionnaire d'événements. En conséquence, vous devrez trouver un moyen de déterminer quel bouton a été cliqué. Une approche peut être d'étendre le contrôle Button pour fournir des propriétés supplémentaires pouvant être utilisées pour reconnaître la période.

Questions connexes