2017-10-03 6 views
1

Je crée un générateur de formulaire qui crée plusieurs onglets et sur chaque onglet placera un DataGridView lié à un ensemble de données dans un tableau de données:Comment gérer les événements d'outils programatically créés dans une boucle

For Each table As DataTable In datasetInput(i).Tables 
    If arr_tables(i)(j).Equals(table.TableName) Then 
     tablename = table.TableName 
     Dim grid As New DataGridView 
     grid.DataSource = table 
     grid.Name = j 
     grid.Location = place 
     grid.Size = New System.Drawing.Size(734, 150) 
     TabPage.TabPages(i).Controls.Add(grid) 
    End If 
Next 

Notez que cette boucle est imbriquée dans une autre boucle qui gère chaque onglet du formulaire. arr_tables est un tableau dentelé qui gère les tables de l'ensemble de données que je veux parce que je ne veux pas tirer chaque datatable dans un DGV.

Maintenant, ce que je dois faire est de formater n'importe quelle cellule qui tombe dans la colonne du nom "Equation". Pour toutes les cellules de la colonne "Equation", je veux être une cellule déroulante avec quelques options différentes. Deuxièmement, comment puis-je gérer un événement de clic de cellule? Dites n'importe quelle cellule qui tombe dans le nom de la colonne "Entrée" Je veux fournir un MessageBox.

Normalement, cela ne poserait aucun problème si les DataGridViews n'étaient pas créés dans une boucle. Mais parce qu'ils sont ils se perdent dans le code et je ne sais pas comment les référencer.

Merci!

+2

Ils ne sont pas perdus. Vous les mettez dans la collection de contrôles de TabPages et c'est là que vous pouvez les trouver. Vous pouvez utiliser 'AddHandler pour connecter des événements à la variable d'objet' grid' avant de le "perdre". – Plutonix

+0

Ohhhhh. Donc, je peux créer le gestionnaire dans la boucle pour chaque grille? Derp, je ne me sens pas stupide maintenant. Merci!!! –

+0

Peut-être que je ne comprends pas quelque chose, mais si vous changez un Nom en 'grid.Name = "dgw" & j' (les noms ne peuvent pas commencer par des nombres, je pense), alors vous devriez les trouver avec leurs noms , c'est-à-dire dgw1, dgw2, dgw3, ... dans TabPage.Tabpages (i) .Controls. –

Répondre

1

Essayez ceci:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    For Each table As DataTable In datasetInput(i).Tables 
     If arr_tables(i)(j).Equals(table.TableName) Then 
      tablename = table.TableName 
      Dim grid As New DataGridView 
      grid.DataSource = table 
      grid.Name = j 
      grid.Location = place 
      grid.Size = New System.Drawing.Size(734, 150) 
      TabPage.TabPages(i).Controls.Add(grid) 

      AddHandler grid.SelectionChanged, AddressOf grid_SelectionChanged 

     End If 
    Next 

End Sub 

Private Sub grid_SelectionChanged(sender As Object, e As EventArgs) 
    ' your code 
End Sub