Aller au contenu

[C#] Passage de données par une référence de formulaire


Arcy

Messages recommandés

Bonjour,

 

J'ai fait une application, composé de 2 formulaires, et si je parviens bien à passer d'une instance à une autre, impossible d'envoyer des données.

 

La fenêtre principale :

public partial class FormListe : Form    {        private FormEntreprise FormEntreprise = null;        private List<Entreprise> listeEntreprises;        private int entAjoutees;         public FormListe()        {            InitializeComponent();            chargementFichier();        }        public void ajoutEntreprise(Entreprise aAjouter)        {            listeEntreprises.Add(aAjouter);            // incrémentation du nombre d'entreprises ajoutées            entAjoutees++;            // ajout à la grille            dg_listeEntreprises.Rows.Add(                aAjouter.Nom,                aAjouter.Coordonnees,                aAjouter.Tel,                aAjouter.Contact,                aAjouter.Site,                aAjouter.Activite,                aAjouter.PremierContact,                aAjouter.Relances,                aAjouter.Etat,                aAjouter.Commentaires,                aAjouter.Url            );        }        private void btn_ajoutEntreprise_Click(object sender, EventArgs e)        {            FormEntreprise = new FormEntreprise();                        // on stocke la référence du formulaire dans une variable du formulaire FormEntreprise            FormEntreprise.RefInstance = this;            FormEntreprise.Show();                        this.Hide();        }   }

La fenêtre pour les entreprises :

public partial class FormEntreprise : Form    {        // http://www.zdnet.fr/actualites/c-comment-ouvrir-des-instances-de-formulaires-windows-2125884.htm?p=2        private FormListe refInstance = null;        public FormListe RefInstance        {            get { return refInstance; }            set { refInstance = value; }        }        public FormEntreprise()        {            InitializeComponent();        }        private void btn_enregistrEntreprise_Click(object sender, EventArgs e)        {            refInstance.ajoutEntreprise(                new Entreprise(                    tb_nom.Text,                    rtb_coords.Text,                    tb_tel.Text,                    rtb_contact.Text,                    tb_site.Text,                    tb_activite.Text,                    cb_premDem_tel.Checked,                    cb_premDem_courriel.Checked,                    cb_premDem_postal.Checked,                    cb_premDem_surPlace.Checked,                    cb_etat.SelectedValue.ToString(),                    rtb_commentaires.Text,                    urlCarte()                ));            refInstance.Show();            this.Close();        }   }

Voilà comment ça marche en principe :

  1. Je suis dans la fenêtre principale, je clique sur le bouton pour ajouter une entreprise (btn_ajoutEntreprise), ce qui masque le formulaire et affiche le deuxième.

    Je sauvegarde dans ce formulaire une référence vers la fenêtre principale (refInstance)
  2. Je saisi les informations sur l'entreprise et je fais enregistrer (btn_enregistrEntreprise).
    Je passe donc par la référence de la fenêtre principale (refInstance, je veux pas instancier un nouveau formulaire) pour accéder à la méthode d'ajout à ma liste d'entreprises, j'affiche cette liste et je ferme le formulaire d'entreprise.

Dans la pratique, ça marche uniquement si on utilise pas refInstance.ajoutEntreprise() (je passe d'un formulaire à l'autre sans problème).

L'erreur est

 

L'exception System.NullReferenceException n'a pas été gérée
  Message=La référence d'objet n'est pas définie à une instance d'un objet.

 

Pourtant, refInstance vaut {Prospection.FormListe, Text: Form1} quand l'application tourne (Prospection étant le namespace, FormList la fenêtre principale).

 

Pourquoi ça foire ? Des solutions ?

 

:inpactitude2:

Lien vers le commentaire
Partager sur d’autres sites

listeEntreprises et dg_listeEntreprises (DataGridView) sont bien initialisées.

Sinon je n'ai pas de variable "Message", c'est juste le message de la boite d'erreur de Visual Studio, quand l'appli crash.

Ah? je me suis posé la même question parce qu'on voit pas ton initialisation dans le code que tu nous donnes! ^^

Genre un:

private var listeEntreprises = new List<Entreprise>();

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Essaye avec ceci :

 

System.Windows.Forms.Application.OpenForms["tonform"] as FormListe).ajoutEntreprise(tonobjet)

Ca fait le même effet.

 

Ah? je me suis posé la même question parce qu'on voit pas ton initialisation dans le code que tu nous donnes! ^^

Genre un:

private var listeEntreprises = new List<Entreprise>();

J'avais cette variable : private List<Entreprise> listeEntreprises;

 

Mais même en la complétant pour obtenir private List<Entreprise> listeEntreprises = new List<Entreprise>();, ça plante (toujours le même message).

Lien vers le commentaire
Partager sur d’autres sites

Tu n'as pas le numéro de la ligne où se déclenche l'erreur ?

 

Sinon quelle est le type de tes variables dans la classe entreprise ?

 

 

édit: J'ai fais un petit essai de mon coté, pas de soucis pour appeler une méthode de l'instance que j'ai passé. Il doit donc bien y avoir un soucis avec les variables que tu utilises dans ajouterEntreprise().

Je viens de voir qu'il y a une méthode "urlCarte()", tu as vérifié quelle fonctionné correctement ?

Lien vers le commentaire
Partager sur d’autres sites

Oui, tu as ça:

private FormEntreprise FormEntreprise = null;
private List<Entreprise> listeEntreprises;

 

Mais du coup ta list n'est pas initialisé!
De plus je sais pas si tu ferai aps mieu de metre deux nom different pour FormEntreprise genre:

private FormEntreprise formEntreprise = null;

 

Edit: de plus même si tu as pas la ligne, met un point d'arret et avance pas à pas, tu vas voir à quel ligne ça part en frite! ^^

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...