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

C# Discussion :

probleme de winform appeler une seconde fois.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut probleme de winform appeler une seconde fois.
    RE bonjour (et désolé d'être un boulet ).

    J'ai une winform(requeteur) qui en appelle une autre(visu). (création d'un rapport).

    Si je ferme la visu et que je la relance depuis requeteur j'ai une erreur au moment d'accéder à un des objet contenu dans visu comme si la fenetre existait dejà.

    quand je fais une exécution pas à pas je remarque que mon objet visu existe toujours bel et bien au moment de la seconde requête.
    je pensait que lorsque l'on utilise un close sur une winform l'objet en question était détruit (ou au moins remis à null).
    est ce normal ? ou est ce que me suis planté ?

  2. #2
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Bonjour,

    En effet lorsque tu fait un from.close() l'objet est détruit.
    http://msdn.microsoft.com/fr-fr/libr...orm.close.aspx

    Ce qui m'interpèle c'est que tu dit que tu veux accéder à ta form hors si tu la close (donc détruit) il faudra donc la reconstruire fatalement et j'ai pas l'impression que c'est cela que tu fait.

    Donc tu as deux solutions :

    - soit tu recréé une instance de ta form
    - soit tu fait simplement un form.Hide() de ta visu , puis form.Show() quand tu veux la ré-afficher en modifiant les valeurs des controls avant si besoin.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    normalement si voila l'extrait de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     if (visu == null)
                    {
     
                        visu = new visualisation_rapport(rptviewer);
                        visu.Show();
                    }
                    else
                    {
                        visu.rechargement_doc(rptviewer);
                    }
    visu est la form appelé.
    visu.chargement_doc permet d'uniquement recharger le document contenu dans le viewer (active report) de la form sans avoir à tout relancer.
    Normalement avec ce code quand je ferme ma form visu elle redevient nul et est recréée la fois d'après ? non ?

    ps : après vérif, mon objet visu existe toujours bel et bien une fois this.Close() lancé.

  4. #4
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Peux-tu envoyer le message d'erreur ?

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    voici l'erreur :
    La référence d'objet n'est pas définie à une instance d'un objet.
    Elle se produit sur viewer qui est l'object qui affiche les rapport (object en parametre).

    j'ai reussi à m'en sortir je pense pas que ça soit super propre par contre

    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
     if (visu == null)
                    {
     
                        visu = new visualisation_rapport(rptviewer);
                        visu.Show();
     
                    }
                    else
                    {
                        if (visu.IsDisposed == true)
                        {
                            visu = null;
                            visu = new visualisation_rapport(rptviewer);
                            visu.Show();
                        }
                        else
                        {
                            visu.rechargement_doc(rptviewer);
                        }
                    }
    j'ai rajouté la vérif du visu.IsDisposed qui me permet de remettre l'object à "null" si il a été fermé.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Par défaut
    Pourquoi ne pas appeler visu en tant que dialogbox?

    Le code est le même à chaque fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    visu = new visualisation_rapport(rptviewer);
     visu.ShowDailog();
    Si tu souhaite conserver la possibilité de switcher de l'une à l'autre pourquoi ne pas utiliser la fonction hide. Tu recupere l'evenemnt closing de la fenetre visu et tu cache la fenetre plutot que de recréer une nouvelle instance à chaque fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void Visu_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
       Visu.Hide(); //Cache la fenetre
       e.Cancel = true; //Evite la fermeture de la fenetre.
    }

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/10/2008, 18h46
  2. Réponses: 2
    Dernier message: 24/05/2007, 13h39
  3. Réponses: 4
    Dernier message: 07/05/2007, 21h20
  4. Réponses: 3
    Dernier message: 08/08/2005, 02h40

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