2017-09-28 3 views
0

J'ai ce morceau de code ...Comment faire pour que chaque bouton/chaque case d'un tableau de boutons 5x5 ait un gestionnaire d'événements différent?

public void initButtons(CheckBox[,] buttons) 
    { 
     int locX = 0; 
     int locY = 0; 

     for(int x = 0; x < buttons.GetLength(0); x++) 
     { 
      for(int y = 0; y < buttons.GetLength(1); y++) 
      { 
       buttons[x, y] = new CheckBox(); 
       buttons[x, y].Appearance = Appearance.Button; 
       buttons[x, y].Location = new Point(locX, locY); 
       buttons[x, y].Size = new Size(60, 60); 
       buttons[x, y].Click += new EventHandler(this.MemoryButton_Clicked); 
       this.Controls.Add(buttons[x, y]); 

       locX += 60; 
      } 
      locX = 0; 
      locY += 60; 
     } 
    } 

... qui crée une grille 5x5 de cases à cocher. Je voudrais que chaque bouton individuel ait un EventHandler différent (au lieu de tous les boutons partageant le même). Est-ce possible?

+4

Faire un tableau de 'EventHandler' avec un pour chacun de vos boutons – gogaz

+0

est btw ce WPF ou WinForms? – gogaz

+1

Vous pouvez utiliser 'Sender' pour vérifier cet exemple https://stackoverflow.com/a/35528628/2946329 –

Répondre

1

Vous pouvez utiliser une expression lambda pour faire une fonction anonyme votre gestionnaire d'événements

buttons[x, y].Click += new EventHandler((s, ea) => 
{ 
    //insert code here; 
}); 

Faire cela utilise des fermetures, de sorte que vous pouvez faire des choses bien ordonnés comme suit.

buttons[x, y].Click += new EventHandler((s, ea) => 
{ 
    var aString = String.Format("my coordinates are {0} and {1}", x, y); 
}); 
0

Ok, donc je l'ai réparé. Fondamentalement, je viens d'ajouter des boutons [x, y] .Name = "Button" + i; et i ++; dans le forloop. Chaque élément du tableau 2d obtient un nom unique et je peux utiliser .Name.Equals plus tard si je veux l'appeler.

Merci à https://stackoverflow.com/a/6511194/7024105