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

VB.NET Discussion :

[VB 2010] tests (et autres actions) sur objets créés dynamiquement


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut [VB 2010] tests (et autres actions) sur objets créés dynamiquement
    Bonjour à tous,
    Comme je l'ai expliqué dans ce post, je créé des objets dynamiquement selon le code ci-dessous :
    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
    Private Sub Button_Ajt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Ajt.Click
    contObj = contObj + 1
            Dim ChpAjtLoyLog As New TextBox()
            With ChpAjtLoyLog
                .Name = "TextBox_Surf_Appart_" & contObj
                .Top = 10 + 25 * contObj
                .Left = 330
                .Visible = True
                .Width = 70
            End With
            TabPage2.Controls.Add(ChpAjtLoyLog)
     
            Dim ChpAjtchkLog As New CheckBox()
            With ChpAjtchkLog
                .Name = "CheckBox_Appart_" & contObj
                .Top = 10 + 25 * contObj
                .Left = 430
                .Text = "Eligible"
                .Visible = True
                .Width = 130
            End With
            TabPage2.Controls.Add(ChpAjtchkLog)
     
            Button_Ajt.Top = 10 + 25 * (contObj + 1)
    Je souhaite tester si l'une des checkbox est cochée. Comme leur nom est composé avec un "index de compteur", je pensais utiliser une boucle for next.

    Malheureusement ça aurait été trop simple, mon code ci-dessous ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim test As Boolean = False
            For i = 1 To contObj Step 1
                If CheckBox_Appart_ &i.ckecked = True Then
                    test = True
     
                End If
            Next
            If test = True Then
                MsgBox("au moins une case chochée")
            End If
    D'autre part, je vais devoir effectuer des calculs avec les différentes textbox (par exemple les additionner) qui ont été crées de le même manière, je pense donc utiliser la même méthodologie.

    Quelqu'un aurait une piste ?
    Merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Re-Bonjour,

    Même réponse que dans ton autre post
    Il ne faut jamais baser un traitement sur le nom des variables (peut importe leur type). C'est voué à l'échec et c'est très dangereux lorsque ton code évolura.

    Le plus simple ne serait-il pas de maintenir une liste de tes checkBox pour ensuite la parcourir et tester si elles sont checked ?

    Bon code,
    J@ck.
    et comme te l'a dit ZenZiTone dans l'autre post tu peux aussi utiliser un dictionary, ou même le tag des controls que tu veux parcourir pour les différencier.

    J@ck.

  3. #3
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Merci de vous pencher sur ma question.

    Citation Envoyé par J@ckHerror Voir le message
    Le plus simple ne serait-il pas de maintenir une liste de tes checkBox pour ensuite la parcourir et tester si elles sont checked ?
    Le "truc" c'est que je ne sais pas à l'avance combien de ligne je vais avoir. C'est pour cette raison que je créé des textbox et checkbox dynamiquement ...

    Je ne comprends pas trop le concept de dictionnaire. C'est une collection d'objet c'est ça ?
    Je n'arrive pas à comprendre comme ça fonctionne et comment l'adapter à mon code.
    Pourriez vous m'éclairer sur ce point ?


    Si je reprend le code de ZenZiTone en l'adaptant, je pourrais faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each obj As Control In Me.Controls
     For i = 1 To contObj Step 1
                If obj.Tag.ToString = "TextBox_Surf_Appart_" & i Then
                    'action à réaliser
                End If
    next
            Next
    Mais dans l'action à réaliser, comment je fais pour lire le contenu de ma textbox ? ou dans le cas d'une checkbox, pour savoir si elle est cochée ?

    D'autre part, pour chacune de mes textbox, lorsque le focus sera perdu je veux vérifier si l'utilisateur a bien entré un nombre (isnumeric). Je veux donc créer un petit sub qui va vérifier cela, si tel n'est pas le cas afficher un message d'erreur et vider le contenu de la textbox en question.
    Je pensais donc stocker le nom de la textbox dans une variable (globale) pour pouvoir interagir facilement dans un autre sub. Mais apparemment ce n'est pas la bonne méthode.
    Comment je pourrais faire en utilisant le code de ZenZiTone ?

    je sais que ça fait beaucoup de questions
    Merci d'avance pour vos réponses

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Citation Envoyé par djedje-08 Voir le message
    Je ne comprends pas trop le concept de dictionnaire. C'est une collection d'objet c'est ça ?
    Dans les grosses lignes c'est ça. La différence avec une liste (List(Of ...)) est que le dictionnaire associe une valeur à une clef. Après je ne sais pas si ça s'adapterais bien à ton cas, il nous manque des infos sur ce qu'est une ligne, etc.. En tous cas je te propose de consulter la doc MSDN à ce sujet pour en savoir plus.

    Citation Envoyé par djedje-08 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each obj As Control In Me.Controls
     <s>For i = 1 To contObj Step 1</s>
                If obj.Tag.ToString = "TextBox_Surf_Appart_" & i Then
                    'action à réaliser
                End If
    <s>next</s>
            Next
    Tu n'as pas besoin de boucle supplémentaire, le test "If composant.tag = "MonIdentifieur"" te permet d'identifier les CheckBoxes que tu as ajoutés dynamiquement.

    Citation Envoyé par djedje-08 Voir le message
    Mais dans l'action à réaliser, comment je fais pour lire le contenu de ma textbox ? ou dans le cas d'une checkbox, pour savoir si elle est cochée ?
    Si tu souhaites lire la valeur de la CheckBox à un instant défnit, tu as juste à caster ton control (dans le "If...") en CheckBox et lire la propriété Checked.

    Citation Envoyé par djedje-08 Voir le message
    D'autre part, pour chacune de mes textbox, lorsque le focus sera perdu je veux vérifier si l'utilisateur a bien entré un nombre (isnumeric). Je veux donc créer un petit sub qui va vérifier cela, si tel n'est pas le cas afficher un message d'erreur et vider le contenu de la textbox en question.
    Je pensais donc stocker le nom de la textbox dans une variable (globale) pour pouvoir interagir facilement dans un autre sub. Mais apparemment ce n'est pas la bonne méthode.
    Comment je pourrais faire en utilisant le code de ZenZiTone ?
    Même dada que ton précédent post : utilise le Addhandler sur ta TextBox crée dynamiquement, sur un événement de type MouseLeave ou LostFocus (je n'ai pas les nom exacte en tête)

  5. #5
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Merci beaucoup pour ton aide, mais pour le coup, je galère un peu à relier tous les éléments.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            Dim ChpAjtLoyLog As New TextBox()
            With ChpAjtLoyLog
                .Name = "TextBox_Surf_Appart_" & contObj
                .Top = 10 + 25 * contObj
                .Left = 330
                .Visible = True
                .Width = 70
            End With
            TabPage2.Controls.Add(ChpAjtLoyLog)
            AddHandler ChpAjtLoyLog.LostFocus, AddressOf VerifNb
    Jusque là, tout va bien, mais le code ci-dessous ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Sub VerifNb()
     
            For Each obj As Control In Me.Controls
                If obj.Tag.ToString = "TextBox_Surf_Appart" Then
                    If IsNumeric(obj.Text) Then
                    Else
                        obj.BackColor = Color.Red
                        obj.Text = ""
     
                    End If
                End If
            Next
        End Sub
    J'ai l'erreur suivante sur la ligne n°4 : La référence de l'objet n'est pas définie a une instance d'un objet

    J'ai essayé avec le code ci-dessous, mais l'erreur est identique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If obj.Tag.ToString = "ChpAjtPrixLog" Then
    De plus, je ne suis pas certain que les codes ci-dessous vont fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IsNumeric(obj.Text)
    obj.BackColor = Color.Red
    obj.Text = ""
    Pourriez vous m'aiguillez ?

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Les événements standards sont généralement associés avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sender As Object, e As EventArgs
    Ce sont des variables qui permettent d'associer des données à l'événement. Si tu utilises l'intellisense lorsque tu fais le AddressOf (tu tapes le nom de la méthode à créer puis tu fais Ctrl+Espace, il te propose de générer la méthode), il génère automatiquement le corps de la méthode avec en paramètre ce que j'ai mis ci-dessus. Ainsi, tu pourras utiliser le "sender" (en faisant le bon cast) pour récupérer l'objet qui a déclenché l'événement. Ainsi tu n'auras pas besoin de faire de boucle sur tous tes contrôles : ça va alléger tes traitements !

    Petite précision, tu risques de voir apparaitre une exception "InvalidOperationException" avec le message "Le contrôle nom du contrôle a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé". Pour comprendre et résoudre ce problème, voici un petit lien vers la MSDN.

Discussions similaires

  1. [VB 2010] Evénement sur objet créé dynamiquement
    Par djedje-08 dans le forum VB.NET
    Réponses: 6
    Dernier message: 18/08/2016, 10h37
  2. Ajouter des Listener sur des objets créés dynamiquement
    Par floctc dans le forum Composants
    Réponses: 10
    Dernier message: 23/04/2010, 16h35
  3. addEventListener sur objet créé dynamiquement
    Par Jim_Nastiq dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/10/2009, 16h20
  4. Réponses: 9
    Dernier message: 31/05/2006, 11h56
  5. action sur objet graphique???
    Par ricardvince dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 27/04/2006, 18h53

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