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 :

rafraichissement formulaire dans un panel


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 192
    Par défaut rafraichissement formulaire dans un panel
    Bonjour à tous,

    J'ai un formulaire principal qui contient un treeview. Un clic sur le noeud parent de ce treeview ouvre un second formulaire contenu dans un panel. Ce formulaire est alimenté par un dataset (a l'evenement load du second formulaire). J'aimerais qu'un autre clic sur un autre noeud parent de ce TV mette le formulaire du panel à jour. Mais rien a faire, je n'y arrive pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      Dim f As New frm_Proprio
                    ' Vérifier si le formulaire est ouvert 
                    If VerifSiFormOuverte("frm_Proprio") = False Then
     
                        f.TopLevel = False
                        Me.Panel1.Controls.Add(f)
                        f.Show()
                    Else
     
                        f.Refresh()
     
                    End If
    f.show fonctionne bien. Par contre pour f.refresh il ne se passe rien.
    Refresh ne force t-il pas le load du formulaire?
    Je n'y comprends vraiment rien car meme f.close ne fonctionne pas. Pour faire un essai, j'ai essayé f.show a la place de refresh. Dans ce cas un nouveau formulaire est crée, mais le focus reste sur le premier, sans mise à jour.

    Auriez-vous une piste?

    Merci d'avance

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonsoir,

    car meme f.close ne fonctionne pas
    Je pense que l'usage de New perturbe ta vue des Form ouverts.

    A chaque Dim f As New frm_Proprio, tu instancies un NOUVEAU Form, un de plus à chaque fois. Comment peux-tu savoir lequel exécute ton Close ?

    Si le Form que tu utilises à cet endroit (dans ton extrait de code) existe dans ton projet (par exemple, il existe un frm_Proprio.vb dans l'explorateur de solution), alors utilise-le directement, sans l'instancier. Cela devrait donner ± ceci (je n'ai pas testé ton code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      ' ************** Dim f As New frm_Proprio
                    ' Vérifier si le formulaire est ouvert 
                    If VerifSiFormOuverte("frm_Proprio") = False Then
                        ' ******** f.TopLevel = False
                        frm_Proprio.TopLevel = False
                        ' ******** Me.Panel1.Controls.Add(f)
                        Me.Panel1.Controls.Add(frm_Proprio)
                        ' ******** f.Show()
                        frm_Proprio.Show()
                    Else
                        frm_Proprio.Refresh() ' probablement pas nécessaire
                        ' ******** f.Refresh()
                    End If
    J'espère te donner une bonne piste ...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 192
    Par défaut
    Merci Phil pour ce conseil. J'avance.....

    Refresh ne fonctionne toujours pas, par contre close fonctionne. Une solution serait de fermer le formulaire à chaque clic pour le réouvrir dans la foulée, mais ca fait mal aux yeux.
    J'ai remarqué qu'en faisant close puis show, le formulaire se met à jour mais ne s'affiche pas dans le panel. Je vais voir de ce coté là, j'ai du louper qq chose....

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,
    Tu dis que ta Form est mise à jour dans le Load. A mon sens, le mieux serait d'ajouter une méthode public à la Form qui ferait la mise à jour. Tu appelles cette méthode dans le Load de ta form et tu l'appelles lorsque tu veux effectuer le rafraîchissement depuis l'autre Form.
    En fait globalement, j'ai pris l'habitude de mettre le minimum de code derrière les Events des Forms (click bouton, Load etc). Je préfère écrire des méthodes et les appeler, cela permet une réutilisation plus simple.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 192
    Par défaut
    Merci ebastien. C'est ce que j'ai fait et ca marche impec.
    Mais le débutant que je suis aimerais comprendre cette histoire d'instance de form.
    Pour pouvoir choisir le mode d'ouverture de mon formulaire et pouvoir le filtrer, j'ai ce code sur la formulaire appelé:
    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
    Public Enum lstTypeOuverture
            ' Ajouter un nouvel enregistrement => Formulaire vierge
            ModeAjouter
            ' Modifier un enregistrement (Argument ID_Filtre obligatoire) => Formulaire chargé avec l'enregistrement correspondant
            ModeModifier
        End Enum
        ''' <summary>
        ''' Constructeur de la classe
        ''' </summary>
        ''' <param name="TypeOuverture">Mode d'ouverture du formulaire "ModeAjouter" ou "ModeModifier". Paramètre spécifier par la liste lstTypeOuverture</param>
        ''' <param name="ID_Filtre">ID de l'enregistrement à charger</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal TypeOuverture As lstTypeOuverture, Optional ByVal ID_Filtre As Integer = 0)
     
            MyBase.New()
            InitializeComponent()
     
            intTypeOuverture = TypeOuverture
            intID= ID_Filtre
     
        End Sub
    Donc le code du formulaire appelant devrait donner ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       If VerifSiFormOuverte("frm_Proprio", lstOptVerifSiFormOuverte.Active) = False Then
                        Dim NewFrm_Proprio As New frm_Proprio(frm_Proprio.lstTypeOuverture.ModeModifier)
                        NewFrm_Proprio.TopLevel = False
                        Me.SplitContainer1.Panel2.Controls.Add(NewFrm_Proprio)
                        NewFrm_Proprio.Show()
                    Else
                        Dim NewFrm_Proprio As New frm_Proprio(frm_Proprio.lstTypeOuverture.ModeModifier)
                        NewFrm_Proprio.ChargerDonnées()
                    End If
    J'ai bien essayé de remplacer NewFrm_Proprio par frm_Proprio (le nom du formulaire) comme me l'a suggéré Phil Rob dans sa réponse, (donc sans créer une nouvelle instance) mais ca provoque une erreur.
    Donc lors du premier clic, VerifSiFormOuverte=false donc le programme créer une instance et tout se passe correctement. Mais lors du second clic, je passe par la condition else et du coup recréé une nouvelle instance.
    Comment est-ce qu'on se sort de ce genre de problème?

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Ce n'est pas très clair.
    En fait je crois me souvenir que VB.Net crée automatiquement une instance pour toutes les forms du projet. C'est ce qu'indiquait Phil Rob en te conseillant d'utiliser cette instance par défaut plutôt que d'en créer une nouvelle à chaque fois.
    Maintenant concernant ton problème, Je ne sais pas ce que fait ta méthode VerifSiFormOuverte : Est-ce qu'elle vérifie que l'instance existe ou bien que la form est visible/affichée/maximisée ?
    Ensuite, si tu veux créer toi-même l'instance de la form plutôt que d'utiliser l'instance par défaut générée par VB.net, il ne faut pas le faire à chaque appel. Tu crées l'instance la première fois (avec le mot clé new) que tu stockes dans une variable globale à ta form et tu réutilises cette instance les fois suivante. Ou bien tu utilises l'instance par défaut ;-)

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Mais oui ebastien, bien vu !
    Le plus convenable est d'utiliser l'instance par défaut. Créer une instance avec New n'a de sens (selon moi) que si on souhaite montrer plus fois simultanément le même formulaire à l'écran ..., ce qui n'a d'intérêt que pour l'affichage de divers lots de données, sans aucun traitement (sinon bonjour la complexité ...).

    Pour en revenir au problème de santacrus, tu dis que ce n'est pas très clair. En effet, je ne conçois déjà pas facilement la nécessité de faire un refresh d'un Form.
    Le code qu'il contient ne devrait-il pas traiter les composants d'affichage à chaque changement de valeur ?
    Il faudrait en savoir plus ...

    Bonne soirée à tous,

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 192
    Par défaut
    Merci à vous!

    J'ai suivi vos conseils et..ca fonctionne. Pourquoi faire simple qd on peut faire compliqué hein?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If VerifSiFormOuverte("frm_Propriétaire", lstOptVerifSiFormOuverte.Active) = False Then
                        frm_Propriétaire.Show()
                        frm_Propriétaire.Activate()
                    Else
                        frm_Propriétaire.ChargerDonnées()
                    End If
    Si le formulaire est fermé, .show provoque le load du form et charge les données. S'il est dejà ouvert, on recharge les données, tout simplement...
    Par contre, si j'enlève la condition et que je fait .show à chaque fois, ca ne fonctionne pas, le form ne se met pas à jour.

    Merci encore. Je peux avancer maintenant!

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

Discussions similaires

  1. [image] dans un panel
    Par phoebe dans le forum Composants
    Réponses: 4
    Dernier message: 13/07/2004, 10h44
  2. Recuperation de formulaire dans une fonction
    Par arsgunner dans le forum ASP
    Réponses: 5
    Dernier message: 23/06/2004, 15h04
  3. [C#] Evenement click dans un Panel
    Par keyser-soze dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/05/2004, 22h21
  4. [Drag & Drop] Mettre une fiche dans un panel
    Par corwin_d_ambre dans le forum Composants VCL
    Réponses: 5
    Dernier message: 12/01/2004, 10h46
  5. comment acceder a un component lui meme dans un panel
    Par mimosa7 dans le forum Composants
    Réponses: 2
    Dernier message: 16/11/2003, 23h02

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