2017-02-21 1 views
0

J'apprends le C# et j'ai l'exercice pour créer une calculatrice avec Windows Forms. En ce moment j'ai juste ajouté 9 boutons pour les nombres et 4 boutons pour les opérations occasionnelles (+, -, *, /) et une étiquette pour écrire dans les nombres comme des chaînes. Actuellement, je fais ceci:WinForms Button Array

private void button1_Click(object sender, EventArgs e) 
{ 
    WriteInLabel(1); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    WriteInLabel(2); 
} 
//etc. 

//function to write the Text in label1 
private void WriteInLabel(int i) 
{ 
    label1.Text += i.ToString(); 
} 

Et se rappelant le principe DRY, cela ressemble à de mauvais genre code écrit pour moi. Existe-t-il un moyen d'écrire ceci mieux? J'ai pensé à quelque chose comme un tableau de boutons/liste. Donc, je pouvais faire quelque chose comme ceci:

for(int i = 0; i < btnArr.Length; i++) 
{ 
    //Is this the correct syntax for appending an eventListener? 
    btnArr[i]Click += (sender, args) => WriteInLabel(i);   
} 

Maintenant, le problème est, je voulais modifier le bouton-propriétés dans le Windows Forms-Designer-View. Puis-je obtenir la conception-vue des boutons créés par le code auto-écrit comme ça?

Button btn1 = new Button(); 

Ou est-il possible de créer automatiquement un tableau des boutons à partir de Form1? J'ai essayé (ne fonctionne pas):

List<Button> btnList = new List<Button>(); 
foreach(Button btn in Form1) 
{ 
    btnList.Add(btn); 
} 
+0

En quoi cela n'a-t-il pas fonctionné? cela dépendrait un peu comment les boutons ont été faits, s'ils ont été ajoutés comme enfants au formulaire etc? – BugFinder

+0

Eh bien, je viens de les ajouter en faisant glisser un Button-Form de la boîte à outils vers le Form1. Et je reçois la ligne rouge squiggly sous Form1 dans mon dernier extrait de code, en disant: Form1 est un type, qui n'est pas valide dans le contexte actuel. –

Répondre

1

si les noms des boutons suivent un certain modèle (par exemple mot « bouton » plus le nombre), vous peut utiliser une boucle pour les recueillir par des noms de la collection Controls de la forme:

List<Button> btnList = 
    Enumerable.Range(1,9) 
    .Select(i => (Button)this.Controls["button"+i.ToString()]) 
    .ToList(); 

si le nombre de boutons est petit, il fait aussi de les énumérer sence simplement tous dans une collection initialiseur:

var btnList = new List<Button> { button1, button2, button3, ... button9}; 
+0

Cela a fonctionné. Merci beaucoup! –

0

Je ne sais pas pourquoi vous voulez créer un tableau de programmation des boutons: vous ne pouvez pas obtenir une vue de la conception de ces boutons.

Vous pouvez attribuer le même gestionnaire d'événements dans le concepteur à tous vos boutons et dans le gestionnaire d'événements faire:

WriteInLabel((sender as Button).Text);