IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.Net]Comment recuperer un Control par le Type et le nom ?


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut [VB.Net]Comment recuperer un Control par le Type et le nom ?
    Si j'ai bonne mémoire, en VB6, quand on copiait un contrôle TextBox avec un nom qui existait déjà, VB6 posait la question de savoir si on voulait créer un tableau de contrôle dont chaque élément était accessible par son index. Exemple myLabel(0).caption ="toto" et myLabel(1).caption="titi".

    Je ne trouve pas d'équivalent. Quelqu'un peut-il m'aider ?

    Si j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim lbl1 as new system.windows.forms.label
    lbl1.name="toto"
    me.control.add(lbl1)
    le label s'ajoute. Mais comment puis-je y accéder ?

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut Re: [VB.Net] label arrays
    Citation Envoyé par Golzinne
    ...
    me.control.add(lbl1)

    La collection en question s'appelle par Controls
    Donc cette propriété te met à disposition une ControlCollection et non un Array
    Elle se gère donc comme n'importequelle autre collection, notamment par sa propriété par défaut Item et sa méthode IndexOf
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim c As Control
    Dim index As Integer = Me.Controls.IndexOf(lbl1)
    If Not(index = -1) Then c = Me.Controls(index)
    Classe Form.ControlCollection
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Bonsoir neguib,

    comme dab ton code fonctionne, mais ici j'ai l'impression de passer à coter d'un truc. Voici le code que j'utilise pour créer des labels dynamiquement, et puis grâce à ton code, je peux y accéder (pour l'exemple je mets simplement un backcolor à red mais le but est simplement d'y accéder).

    ma sub initLabel crée les labels. J'y ai inclu une collection lblDynCol qui est indexée et c'est comme ça que dans ma sub setBackToRed j'accède à un contrôle pour l'exemple.

    Est-ce que je ne complique pas un peu trop :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub initLabel()
     
            Dim r As Integer
            Dim c As Integer
     
            For r = 1 To 5
                For c = 1 To 4
                    Dim lab As New System.Windows.Forms.Label
                    lab.Name = "lab" & Format(c, "00") & Format(r, "00")
                    lab.Location = New System.Drawing.Point(50 * (c - 1), 17 * (r - 1) + 23)
                    lab.Size = New System.Drawing.Size(50, 17)
                    lab.Text = "Lab" & Format(c, "00") & Format(r, "00")
                    Me.Controls.Add(lab)
                    Me.lblDynCol.Add(lab, Format(c, "00") & Format(r, "00"))
                Next c
            Next r
        End Sub
     
        Sub setBackToRed()
            Dim con As Control
            Dim index As Integer = Me.Controls.IndexOf(lblDynCol.Item("01" & "01"))
            If Not (index = -1) Then con = Me.Controls(index)
            con.BackColor = SystemColors.Control.Red
        End Sub

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    Option Explicit On
    Option Strict On
     
    Imports System
    Imports System.Drawing
    Imports System.Windows.Forms
     
    '...
      Private Const lab As String = "lab"
     
      Private Function GetControlByName(ByVal name As String) As Control
        Dim ctrl As Control
        For Each ctrl in Me.Controls
          If (typeOf(ctrl) Is Label) AndAlso (ctrl.Name.Equals(name)) Then Return ctrl
        Next
        Return Nothing
      End Function
      Private Sub InitializeLabels()
         Dim c As Integer
         Dim l As Label
         Dim r As Integer
     
         For r = 1 To 5
            For c = 1 To 4
               l = New Label()
               l.Name = lab & Format(c, "00") & Format(r, "00")
               l.Location = New Point(50 * (c - 1), 17 * (r - 1) + 23)
               l.Size = New Size(50, 17)
               l.Text = "Lab" & Format(c, "00") & Format(r, "00")
               Me.Controls.Add(l)
            Next c
         Next r
      End Sub
     
      Private Sub SetRedBackGround(ByVal name As String)
         Dim ctrl As Control = Me.GetControlByName(name)
     
         If Not (ctrl Is Nothing) Then ctrl.BackColor = Color.Red
      End Sub
    Histoire d'avoir une collection en moins à gérer
    Tu peux enlever If (typeOf(ctrl) Is Label) si tu veux verifier sur tous les types de contrôles
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Merci neguib (l'homme qui ne dort jamais)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 26/07/2005, 14h38
  2. Réponses: 6
    Dernier message: 16/06/2005, 09h07
  3. Réponses: 4
    Dernier message: 19/05/2005, 16h11
  4. Réponses: 2
    Dernier message: 22/04/2005, 15h53
  5. [VB.Net] Comment renvoyer un SQLDataReader par un service Web ?
    Par moufles03 dans le forum Services Web
    Réponses: 4
    Dernier message: 13/07/2004, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo