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]retirer un contrôle d'un autre contrôle


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]retirer un contrôle d'un autre contrôle
    Bonjour,

    j'ajoute un userControl usrLiv à un flowLayoutPanel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    me.flowLayoutPanel.Controls.add(usrLiv)
    AddHandler usrLiv.AdClick, adressOf AdrPan_Click
    Comme vous le voyez, j'ajoute aussi un Handler sur mon usrLiv.

    J'ajoute d'autres usrLiv et d'autres handler sur mon flowLayoutPanel

    A un moment, je dois effacer le premier usrLiv : et je tente d'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    me.controls.remove(me.flowLayout.controls.Item(0))
    Bien que ça ne génère pas d'erreur, ça n'a aucun effet.

    Comment faire ?

    En plus, je voudrais aussi retirer les handler, mais ça j'ai aucune idée.



    un

  2. #2
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Bonjour

    Verifie ce qu'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    me.flowLayout.controls.Item(0).Name
    Il se peut que tu enleves la barre de defilement ou tout autre controle interne de ton flowpanel

  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
    Bonjour,

    Merci de t'intéresser à mon problème.

    J'avais déjà testé, il me retourne "ADR0" qui est bien le nom du premier objet que j'ai ajouté sur FlowLayoutPanel.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 291
    Points
    291
    Par défaut
    Il faut peut-être faire un ResumeLayout ...

  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
    Salut à tous,

    Voici le code que je mets sur un bouton de test, juste pour pouvoir retirer à chaque click un de mes 5 objets que j'ai ajouté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim usrLiv As AdresseUserCtrl
            usrLiv = Me.FlowLayoutLiv.Controls.Item(0)
            MsgBox(Me.FlowLayoutLiv.Controls.Item(0).Name)
            Me.Controls.Remove(Me.FlowLayoutLiv.Controls.Item(0))
            ResumeLayout()
     
            'MsgBox(Me.FlowLayoutLiv.Controls.Count.ToString)
        End Sub
    J'y ai rajouté le resumeLayout mais ça ne change rien, d'ailleurs c'est normal car au premier click, le msgBox me retourne AdrPan0 qui est le nom du premier objet que j'ai ajouté, au deuxième click, il decrait me retourner, pour Item(0), AdrPan1 qui est le deuxième objet que j'ai ajouté (puisque le premier aurait été enlevé de la collection). Mais il n'en est rien, il me retourne invariablement adrPan0, ce qui veut dire qu'il n'a pas été enlevé !

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Salut, je voudrais bien t'aider mais je ne sais pas ce qu'est un flowLayout ?

    Quelle est ta logique de suppression ? sur un click de boutton on supprime n'importe lequel ? le dernier ajouté ? celui sélectionné dont on a gardé une référence dans une variable privée ?

    Je vois que tes controles sont des usercontrols ça peut aider si on doit rechercher par rapport au type.

    Bon moi comme je vois les choses :

    1- tu fais ta boucle d'ajout
    dim usrLiv as AdresseUserCtrl

    For i = 1 to nb
    usrLiv = New AdresseUserCtrl
    AddHandler usrLiv.MonEvent, AddressOf MaMethode
    Me.Controls.Add(usrLiv)
    Next

    2- si tu as une variable privée qui pointe sur l'élément à supprimer (c'est le mieux mais ça ne colle pas forcement avec ce qui est possible dans ton cas ??)

    RemoveHandler usrLiv.MonEvent, AddressOf MaMethode ' si tu veux juste délier l'objet à la méthode
    Me.Controls.Remove(MaUserLiv) ' ça doit marcher

  7. #7
    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
    Salut NiamorH (et les autres aussi),

    Je marque flowLayout, mais c'est en fait flowLayoutPanel.

    c'est donc un panneau dans lequel je peux rajouter des objets, dans mon cas un userControl qui affiche une adresse.

    ça donne ceci



    ou une fois que j'ai choisi une société, je vois son adresse de facturation, trois adresses de livraisons et une adresse postale. C'est toi qui m'a donné le truc pour ajouter dynamiquement le userControl au flowLayoutPanel et pour y ajouter le handler.

    Je vois que dans ton code tu retires d'abord le handler avant de retirer le contrôle, moi j'essaye directement de retirer mon userCtrl avant de retirer le handler, peut-être est-ce pour ça que ça ne fonctionne pas. j'essayes d'ici une heure et je te tiens informé.

    Merci

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    salut, je ne pense pas que ce soit cela qui dérange mais tu peux essayer, par contre ce qui me dérange dans TON code :

    Citation Envoyé par Golzinne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim usrLiv As AdresseUserCtrl
            usrLiv = Me.FlowLayoutLiv.Controls.Item(0)
            MsgBox(Me.FlowLayoutLiv.Controls.Item(0).Name)
            Me.Controls.Remove(Me.FlowLayoutLiv.Controls.Item(0))
            ResumeLayout()
     
            'MsgBox(Me.FlowLayoutLiv.Controls.Count.ToString)
        End Sub
    c'est que lorsque tu fais Remove tu te place sur la collection des controles de ta FORM et non de ton PANEL
    essaye plutot de faire ton remove comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.FlowLayoutLiv.Controls.Remove(Me.FlowLayoutLiv.Controls.Item(0))

  9. #9
    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


    Bien vu !

    Effectivement il faut utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Me.FlowLayoutLiv.Controls.Remove(Me.FlowLayoutLiv.Controls.Item(0))
    Maintenant on peut se demander pourquoi il ne plantait pas que j'enlevais de la collection du formulaire ... mais ça n'a pas d'importance.

    Au niveau du removeHandler, ça à l'air de fonctionner, mais comment puis-je vérifier quels handlers sont présents à un moment donné de l'utilisation de mon application. On pourrait imaginer que si il ne les enlève pas convenablement, mon système "explose" à un moment donné sous le nombre des handlers qui traînent !

    Je te remercie une fois de plus pour ta brillante intervention !

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Comme tu l'as dis plus haut, lorsqu on fait un remove(object) sur une collection et que l'objet n'existe pas, il ne fait simplement rien.

    Le removehandler fonctionne je l'utilise notament sur des dataview pour eviter les boucles infinies lorsqu'ils ont du code sur l'évènement ListChanged et que je doit mettre à jour leur Rowfilter.

    Je ne pense pas que ton appli "explose" sous le poids des handler.
    à mon avis le handler est automatiquement supprimé lorsque tu fait Remove(ctrl) mais je ne peux pas te l'assurer.
    Si tu veux avoir la conscience tranquille, tu fait un AddHandler lors de la création et un removeHandler lors de la suppression et la tout est propre.

  11. #11
    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
    Je ferai comme çà pour avoir la conscience tranquille !

    Mais j'aurais bien vu l'utilisation d'un truc du style de " l'object browser "pour voir tous les événements existants à un moment donné, là j'aurai vraiment pu dormir sur mes deux oreilles 8)

    Merci encore

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

Discussions similaires

  1. [Débutant] vb.net - Créer un contrôle sur une autre form
    Par Nerpson dans le forum Windows Forms
    Réponses: 4
    Dernier message: 17/09/2014, 16h36
  2. Réponses: 7
    Dernier message: 06/06/2008, 22h16
  3. Réponses: 3
    Dernier message: 22/09/2006, 14h31
  4. SetFOcus sur un contrôle d'une autre feuille d'un multipage
    Par MacGeol dans le forum VB 6 et antérieur
    Réponses: 29
    Dernier message: 07/09/2005, 09h37
  5. [VB.NET]Récuperer des valeurs d'une autre page
    Par Dnx dans le forum ASP.NET
    Réponses: 8
    Dernier message: 12/05/2005, 16h19

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