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 :

la suppression d'un controle créé dynamiquement


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Par défaut la suppression d'un controle créé dynamiquement
    bonjour,

    j'ai créé des textbox dynamiquement,
    mais quand je supprime le dernier , et je crée un autre je trouve que l'index continue dans l'ordre precedent
    example:
    le dernier a l'index 9
    je le supprime par champ.dispose
    je crée un autre que je suppose qu'il aura l'index 9 de nouveau, mais je trouve qu'il a l'index 10
    mon code:

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Public Class Form1
        Dim i As Integer
     
        Dim macollection As New Collection
        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim champ As New TextBox
     
            i = i + 1
     
            champ.Name = "tot" & Str(i)
            Me.Controls.Add(champ)
            macollection.Add(champ)
     
            champ.Top = 30 * i
            champ.Left = 100
            champ.Width = 400
            champ.Height = 20
     
            macollection(i).Text = "voila je suis numero" & Str(i) & Chr(32) & macollection(i).Left & Chr(32) & macollection(i).Top
            AddHandler champ.KeyPress, AddressOf changerletexte
     
        End Sub
     
        Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim l As Integer
            For l = 1 To macollection.Count
                If l = macollection.Count Then
                    macollection(l).dispose()
                    MsgBox(l)
    'issi je trouve que l = i! 
    'meme après la suppression du dernier champ!
    'pour quoi il y a un champ dans l'index qui reste vide?
    'comment je peux supprimer le dernier champ de l'index à chaque fois en cliquant sur ce bouton?
                End If
            Next
     
        End Sub
     
        Private Sub changerletexte(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
            Dim k As Integer
     
            For k = 1 To macollection.Count
                If macollection(k).name = sender.name Then
    msgbox(macollection(k).text)
                End If
            Next
     
        End Sub
     
    End Class
    est ce qu'il y a une methode pour garder la contiguité des textbox créés namport quelle que soit l'index supprimé?
    je vous remercie en avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Par défaut
    Ce serait pas mal de mettre des balises CODE pour ton code ^^

    Sinon ben il faut que tu enleves l'élément de ta collection, il doit y avoir une fonction remove ou delete pour la collection.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    Dispose ne supprime pas ta textbox, il desalloue la memoire occupee, si tu veux la supprimer tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maCollection.removeAt(i)
    Ju

  4. #4
    Membre Expert Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Par défaut
    *idem je lit mm pas ton code ....*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ' On efface la boite
            Me.Controls.Remove(pictBoite(NumTypeCouche, NumBoite))
    je crée des pictureBox dynamiquement,
    et je les effacées a l'aide de ce code

    Bonne continuation

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    les collections ne vont pas de 1 à count mais de 0 à count-1

    et il faut en effet remover de la collection après dispose

    et tu boucles pour rien, tu boucles et arrivé au dernier tu fais .dispose
    autant disposer le dernier élément directement sans boucler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    macollection(macollection.count -1).dispose
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par hunteshiva Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ' On efface la boite
            Me.Controls.Remove(pictBoite(NumTypeCouche, NumBoite))
    je crée des pictureBox dynamiquement,
    et je les effacées a l'aide de ce code
    ce code n'est pas super top
    un control est non managé il est donc nécessaire d'appeler Dispose pour qu'il libère la mémoire
    appeler Dispose sur un control fait aussi qu'il se détache automatiquement de son parent (et donc n'apparait plus dans Me.Controls)

    (le cas du posteur est différent, c'est une collection à lui, donc il doit faire remove manuellement après Dispose)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre Expert Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Par défaut
    ??
    je suis amateur en vb

    tu veut dire que quand je fait juste remove, sa le supprime mais pas de la mémoire ?

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par hunteshiva Voir le message
    ??
    je suis amateur en vb

    tu veut dire que quand je fait juste remove, sa le supprime mais pas de la mémoire ?
    c'est ce que je dis oui, ca le supprime visuellement seulement

    enfin ca sera supprimé de la mémoire (grace au garbage collector) mais seulement quand l'OS arrivera à saturation
    Dispose sur les éléments Disposable permet une libération immédiate de la mémoire non managée
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Par défaut
    bon soir tous le monde,

    je vous remercie vous tous pour vos réponse.

    concernant la balise code,
    excusez moi.
    je n'ai pas fait l'attention
    cordialement

    Maan

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    les collections ne vont pas de 1 à count mais de 0 à count-1

    et il faut en effet remover de la collection après dispose

    et tu boucles pour rien, tu boucles et arrivé au dernier tu fais .dispose
    autant disposer le dernier élément directement sans boucler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    macollection(macollection.count -1).dispose
    bon soire Pol63,

    toujour je n'arrive pas à supprimer le dernier textbox chaque fois où je clique sur le bouton!
    voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    macollection(macollection.Count - 1).dispose()
            macollection.Remove(macollection.Count - 1)
            MsgBox(macollection.Count)
    merci bien

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    macollection.Count - 1 est un nombre, ton code essaye donc de supprimé le nombre de la collection, collection qui ne contient surement pas de nombres ...
    donc soit lui dire de remover le numéro tant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    macollection(macollection.Count - 1).dispose()
    macollection.RemoveAt(macollection.Count - 1)
    MsgBox(macollection.Count)
    soit lui dire de remover le textbox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    macollection(macollection.Count - 1).dispose()
    macollection.Remove(macollection(macollection.Count - 1))
    MsgBox(macollection.Count)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    macollection.Count - 1 est un nombre, ton code essaye donc de supprimé le nombre de la collection, collection qui ne contient surement pas de nombres ...
    donc soit lui dire de remover le numéro tant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    macollection(macollection.Count - 1).dispose()
    macollection.RemoveAt(macollection.Count - 1)
    MsgBox(macollection.Count)
    soit lui dire de remover le textbox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    macollection(macollection.Count - 1).dispose()
    macollection.Remove(macollection(macollection.Count - 1))
    MsgBox(macollection.Count)
    dans les deux cas, ca genere un erreur!
    et dans le premier cas il genere une erreur disant que
    RemoveAt n'est pas un membre de la collection

  13. #13
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim macollection As New Collection
    =>


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim macollection As New system.collections.generic.list(of textbox)
    et le RemoveAt devrait être dispo




    et si tu comptes atteindre un bon niveau, il faut prendre le temps de lire des cours/tutos comme celui ci http://plasserre.developpez.com/cours/vb-net/
    et aussi paramétrer VB comme il faut pour qu'il t'empêche d'écrire des conneries/bugs (option strict on entre autres)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Par défaut
    voici mon code finale
    j'ajoute un textbox et je peux le supprimer, et chaque fois je clique sur le bouton de suppression je supprime le dernier textbox.
    si je reajoute un textbox va avoir l'index du dernier textbox supprimé
    mais j'ai partis de car la faite de metre - 1
    supprime le textbox qui est avant le dernier!
    je vous remercie tous pour votre aide
    et merci bien Pol63.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    Public Class Form1
        Dim i As Integer
     
        Dim macollection As New Collection
        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.BackColor = Color.Black
            Dim champ As New TextBox
     
            i = macollection.Count + 1
     
     
            champ.Name = "tot" & Str(i)
            Me.Controls.Add(champ)
            macollection.Add(champ)
     
            champ.Top = 30 * i
            champ.Left = 100
            champ.Width = 400
            champ.Height = 20
     
            macollection(i).Text = "voila je suis numero" & Str(i) & Chr(32) & macollection(i).Left & Chr(32) & macollection(i).Top
            AddHandler champ.KeyPress, AddressOf lolo
     
        End Sub
     
        Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
     
     
            If macollection.Count <> 0 Then
                macollection(macollection.Count).dispose()
                macollection.Remove(macollection.Count)
                MsgBox(macollection.Count)
            End If
     
        End Sub
     
        Private Sub lolo(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
     
     
            Dim k As Integer
     
            For k = 1 To macollection.Count
                If macollection(k).name = sender.name Then
                    Select Case Asc(e.KeyChar)
                        Case AscW(ControlChars.Cr) 'Enter key
                            e.Handled = True
     
                        Case AscW(ControlChars.Back) 'Backspace
     
                        Case 45, 46, 48 To 57 'Negative sign, Decimal and Numbers
     
                        Case Else ' Everything else
                            e.Handled = True
                    End Select
     
     
     
     
                End If
            Next
     
        End Sub
     
     
     
        Private Sub Button1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Button1.KeyPress
     
        End Sub
     
        Private Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
     
        End Sub
    End Class
    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
    Public Class Form1
        Dim i As Integer
     
        Dim macollection As New Collection
        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim champ As New TextBox
     
            i = macollection.Count + 1
     
     
            champ.Name = "tot" & Str(i)
            Me.Controls.Add(champ)
            macollection.Add(champ)
     
            champ.Top = 30 * i
            champ.Left = 100
            champ.Width = 400
            champ.Height = 20
     
            macollection(i).Text = "voila je suis numero" & Str(i) & Chr(32) & macollection(i).Left & Chr(32) & macollection(i).Top
            AddHandler champ.KeyPress, AddressOf changerletexte
     
        End Sub
     
        Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
     
     
            If macollection.Count <> 0 Then
                macollection(macollection.Count).dispose()
                macollection.Remove(macollection.Count)
                MsgBox(macollection.Count)
            End If
     
        End Sub
    End Class

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim macollection As New Collection
    =>


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim macollection As New system.collections.generic.list(of textbox)
    et le RemoveAt devrait être dispo




    et si tu comptes atteindre un bon niveau, il faut prendre le temps de lire des cours/tutos comme celui ci http://plasserre.developpez.com/cours/vb-net/
    et aussi paramétrer VB comme il faut pour qu'il t'empêche d'écrire des conneries/bugs (option strict on entre autres)
    merci bien pour ce cours, vraiment est un cours bien détaillé, grand merci à son auteur.
    concernant le parametrage de l'environnement, je ne sais pas comment faire, si tu peux un peux expliquer?
    cordialement

  16. #16
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    dans les propriétés du projet tu peux définir le comportement du compilateur
    tu peux aussi le définir dans outils/options et les paramètres seront alors pris à chaque nouveau projet

    option strict on interdit par exemple des conversions implicites comme tu en fais un peu partout
    genre
    macollection(i).Text
    nulle part tu as écrit dans ton code que macollection contient des textbox, elle pourrait donc contenir des carottes
    et unecarotte.Text n'existe pas donc le compilateur ne te laisserait pas écrire macollection(i).Text (et il faudrait pas une conversion ou un cast explicite)
    d'ailleurs je ne pense pas que l'autocomplétion te propose .Text

    ca peut paraitre chiant de pas pouvoir écrire ce qu'on veut, mais ca évite les bugs quand le code commence à être conséquent
    parce que tous les développeurs font des bugs, c'est normal, mais avoir des barrières de protection permet d'en faire moins
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    dans les propriétés du projet tu peux définir le comportement du compilateur
    tu peux aussi le définir dans outils/options et les paramètres seront alors pris à chaque nouveau projet

    option strict on interdit par exemple des conversions implicites comme tu en fais un peu partout
    genre
    macollection(i).Text
    nulle part tu as écrit dans ton code que macollection contient des textbox, elle pourrait donc contenir des carottes
    et unecarotte.Text n'existe pas donc le compilateur ne te laisserait pas écrire macollection(i).Text (et il faudrait pas une conversion ou un cast explicite)
    d'ailleurs je ne pense pas que l'autocomplétion te propose .Text

    ca peut paraitre chiant de pas pouvoir écrire ce qu'on veut, mais ca évite les bugs quand le code commence à être conséquent
    parce que tous les développeurs font des bugs, c'est normal, mais avoir des barrières de protection permet d'en faire moins
    je te remercie bien pour ton aide sérieuse.

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

Discussions similaires

  1. ajout et suppression d'un Controls dynamiquement
    Par abcdefg dans le forum Windows Forms
    Réponses: 1
    Dernier message: 31/03/2010, 00h40
  2. SUppression Control UserForm dynamique
    Par Mr_JF dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/02/2008, 13h49
  3. [VB]Définir un événement à un controle créé dynamiquement
    Par Ooly2001 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/01/2006, 12h15
  4. Réponses: 9
    Dernier message: 28/10/2005, 14h48
  5. [C#]web control user dynamique??
    Par norkius dans le forum ASP.NET
    Réponses: 3
    Dernier message: 11/12/2003, 19h35

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