none
Procédure d'événement Click pour une collection de contrôles Label en VB RRS feed

  • Question

  • Bonjour,

    J'ai établi le code dans la procédure FormLoad pour générer une collection de 32 labels identiques indexés de 0 à 31. Exemple label(0), label(1) etc...

    Je voudrais établir une procédure MouseClick pour toute la collection c'est-à-dire que n'importe lequel des items de cette collection réponde à l'événement comme Handler. Les labels sont tous localisés directement sur le WinForm sans aucun conteneur. Comment rédiger la première ligne de code de cette procédure?  {VB 2010, Windows 7}

    Merci.

    jeudi 10 janvier 2013 00:36

Réponses

  • Bonjour,

    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            For dx1 = 0 To 31
                Dim labelList As New Label
                With labelList
                    .Width = 38
                    .Height = 76
                    .Location = New System.Drawing.Point(515 + (dx1 Mod 8) * 77, 141 + (dx1 \ 8) * 77 + (dx1 \ 16) * 308)
                    .AutoSize = False
                    .BackColor = Color.Gray
                    .AllowDrop = True
    
                    .Name = "labelClick" & dx1
                End With
                AddHandler labelList.Click, AddressOf LabelClick
                Controls.AddRange(New System.Windows.Forms.Control() {labelList})
            Next dx1
        End Sub
    
        Private Sub LabelClick(sender As Object, e As EventArgs)
            MsgBox(CType(sender, Label).Name)
        End Sub
    End Class
    


    Cordialement,

    • Proposé comme réponse TroxsaEditor mardi 15 janvier 2013 19:14
    • Marqué comme réponse cardinarouge mercredi 16 janvier 2013 17:08
    mardi 15 janvier 2013 19:13
    Auteur de réponse

Toutes les réponses

  • Bonjour Cardinarouge,

    Si ma réponse t'apporte la solution, merci de cliquer dans le rectangle où il y a un triangle vert, en haut, à gauche de cette réponse, et si le sujet est clôs, de l'indiquer en bas.

    Tu parles de 0 à 31, les collection pour mémoire commencent à 1 donc l'utilisation sera 1 à 32.

    J'ai confectionné un logiciel d'aide vbNet qui fait automatiquement des déclarations de collections (entre autres), il est gratuit et se trouve à :

    http://irolog.free.fr/gratuit.htm

    A "aide vb net", tu as même la source en dessous.

    Voici enfin ton code, y a plus qu'à coller au bon endroit :

    Dim lab As New Collection() ' global
    
    lab.Add(Label1) ' load
    lab.Add(Label2)
    lab.Add(Label3)
    lab.Add(Label4)
    lab.Add(Label5)
    lab.Add(Label6)
    lab.Add(Label7)
    lab.Add(Label8)
    lab.Add(Label9)
    lab.Add(Label10)
    lab.Add(Label11)
    lab.Add(Label12)
    lab.Add(Label13)
    lab.Add(Label14)
    lab.Add(Label15)
    lab.Add(Label16)
    lab.Add(Label17)
    lab.Add(Label18)
    lab.Add(Label19)
    lab.Add(Label20)
    lab.Add(Label21)
    lab.Add(Label22)
    lab.Add(Label23)
    lab.Add(Label24)
    lab.Add(Label25)
    lab.Add(Label26)
    lab.Add(Label27)
    lab.Add(Label28)
    lab.Add(Label29)
    lab.Add(Label30)
    lab.Add(Label31)
    lab.Add(Label32)
    
    Sub lab_MouseClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label1.MouseClick, Label2.MouseClick, Label3.MouseClick, Label4.MouseClick, Label5.MouseClick, Label6.MouseClick, Label7.MouseClick, Label8.MouseClick, Label9.MouseClick, Label10.MouseClick, Label11.MouseClick, Label12.MouseClick, Label13.MouseClick, Label14.MouseClick, Label15.MouseClick, Label16.MouseClick, Label17.MouseClick, Label18.MouseClick, Label19.MouseClick, Label20.MouseClick, Label21.MouseClick, Label22.MouseClick, Label23.MouseClick, Label24.MouseClick, Label25.MouseClick, Label26.MouseClick, Label27.MouseClick, Label28.MouseClick, Label29.MouseClick, Label30.MouseClick, Label31.MouseClick, Label32.MouseClick
     Dim i As Integer = 0
     For i = 1 To lab.Count
      If lab.Item(i).Name = sender.Name Then MsgBox("L'index est : " & i)
     Next i
    End Sub
    

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Proposé comme réponse EhJoe jeudi 10 janvier 2013 10:01
    jeudi 10 janvier 2013 09:59
  • Bonjour EhJoe,

    Content de te retrouver. Ce que tu me propose ici je le sais déjà. Cela ne convient pas parce que j'ai absolument besoin d'un index sous la forme d'une variable. Et cela pour que le programme puisse ultérieurement de lui-même sans événement extérieur modifier le contenu d'un label en calculant son index. Le programme adresse ainsi le label par la variable qu'il a calculé et cela peut être aléatoire lors de l'exécution. Voici mon code pour établir le LabelList. Cela fonctionne et les labels s'affichent bien sur le WinForm.

       Private Sub frmÉchiquier_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            For dx1 = 0 To 31
                labelList.Add(New Label)
                With labelList.Item(labelList.Count - 1)
                    .Width = 38
                    .Height = 76
                    .Location = New System.Drawing.Point(515 + (dx1 Mod 8) * 77, 141 + (dx1 \ 8) * 77 + (dx1 \ 16) * 308)
                    .AutoSize = False
                    .BackColor = Color.Gray
                    .AllowDrop = True
                End With
                Controls.AddRange(New System.Windows.Forms.Control() {labelList(labelList.Count - 1)})
            Next dx1
        End Sub

    J'ai vérifié dans la fenêtre des variables locales et dans mon cas l'index est bien de 0 à 31 et c'est cela dont j'ai besoin. Mais parce que j'ai aussi besoin de faire un Click de temps-à-autre sur un label je dois avoir la procédure avec un LabelList qui utilise une variable numérique comme index.

    Cela était facile avec l'ancien VB. J'ai souvent l'impression que Microsoft a compliqué VB sans justification avec le temps.

    Merci.

    jeudi 10 janvier 2013 16:05
  • Bonjour encore,

    Je pense avoir la rubrique de la bibliothèque qui traite ce sujet en profondeur.

    Une bonne étude du sujet et l'expérimentation proposée sont à mon avis nécessaires.

    http://msdn.microsoft.com/fr-fr/library/aa289500(v=VS.71).aspx

    Le titre: "Création de tableaux de contrôles dans Visual Basic.NET"

    Merci.

    jeudi 10 janvier 2013 23:28
  • Cher Cardinarouge,

    Alors, comme tu veux faire je ne sais pas récupérer l'indice du label dans un procédure mouse_click, par contre si tu prends mon exemple, tu le peux, alors, pourquoi ne fais-tu pas ça selon mon exemple ?

    Et pour indicer le label, ça se fait avec un variable globale (vg) sur la base de la liste :

    lab(vg)

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    • Modifié EhJoe vendredi 11 janvier 2013 05:27
    vendredi 11 janvier 2013 05:25
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 15 janvier 2013 08:40
  • Bonjour,

    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            For dx1 = 0 To 31
                Dim labelList As New Label
                With labelList
                    .Width = 38
                    .Height = 76
                    .Location = New System.Drawing.Point(515 + (dx1 Mod 8) * 77, 141 + (dx1 \ 8) * 77 + (dx1 \ 16) * 308)
                    .AutoSize = False
                    .BackColor = Color.Gray
                    .AllowDrop = True
    
                    .Name = "labelClick" & dx1
                End With
                AddHandler labelList.Click, AddressOf LabelClick
                Controls.AddRange(New System.Windows.Forms.Control() {labelList})
            Next dx1
        End Sub
    
        Private Sub LabelClick(sender As Object, e As EventArgs)
            MsgBox(CType(sender, Label).Name)
        End Sub
    End Class
    


    Cordialement,

    • Proposé comme réponse TroxsaEditor mardi 15 janvier 2013 19:14
    • Marqué comme réponse cardinarouge mercredi 16 janvier 2013 17:08
    mardi 15 janvier 2013 19:13
    Auteur de réponse