Comment garder un objet tous le long du programme

- - Dernière réponse : soussous78
Messages postés
47
Date d'inscription
mardi 21 novembre 2006
Statut
Membre
Dernière intervention
5 novembre 2016
- 12 févr. 2013 à 21:31
Bonjour,

Voilà je suis en train de développer une petite application en C# sous forme de MDI Parent, il y a donc à l’intérieur un formulaire d'inscription/Connexion qui marche, j'ai créer une classe Compte.cs avec des propriété pour y mettre toutes les informations du comptes en mémoire le soucis est que lorsque je vais dans une autre windows form je ne peux plus accéder à mon objet:

voici le code lors de la connection:

if (donnees.HasRows)
{
while (donnees.Read())
{
int Id_Compte = donnees.GetInt32(0);
string Pseudo_Compte = donnees.GetString(1);
string Mdp_Compte = donnees.GetString(2);
string Mail_Compte = donnees.GetString(3);
int PV_Restant_Compte = donnees.GetInt32(4);
int PV_Maximum_Compte = donnees.GetInt32(5);
int PM_Restant_Compte = donnees.GetInt32(6);
int PM_Maximum_Compte = donnees.GetInt32(7);
int Force_Compte = donnees.GetInt32(8);
int Magie_Compte = donnees.GetInt32(9);
int Defense_Compte = donnees.GetInt32(10);
int PO_Compte = donnees.GetInt32(11);
int PC_Compte = donnees.GetInt32(12);
string Status_Compte = donnees.GetString(13);
Compte compte = new Compte(Id_Compte, Pseudo_Compte, Mdp_Compte, Mail_Compte, PV_Restant_Compte, PV_Maximum_Compte, PM_Restant_Compte, PM_Maximum_Compte, Force_Compte, Magie_Compte, Defense_Compte, PO_Compte, PC_Compte, Status_Compte);
MessageBox.Show("Bienvenue " + compte.Pseudo);
}

Voici le code que je voudrais mettre sur une autre form:

Afficherpseudolabel = compte.pseudo et la il ne connait pas compte.pseudo alors que sur la forme ou j'ai créer l'objet il le reconnait comment faire pour que mon objet reste existant quelque soit la partie du programme ou je suis

Cordialement, Jérémy
Afficher la suite 

5 réponses

0
Merci
Voici la classe Compte.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlServerCe;
using System.Data.SqlTypes;

namespace Caranille
{
    public class Compte
    {
        public int Id;
        public string Pseudo;
        public string Mdp;
        public string Email;
        public int PV_Restant_Compte;
        public int PV_Maximum_Compte;
        public int PM_Restant_Compte;
        public int PM_Maximum_Compte;
        public int Force_Compte;
        public int Magie_Compte;
        public int Defense_Compte;
        public int PO_Compte;
        public int PC_Compte;
        public string Status_Compte;

        public Compte(int id, string pseudo, string mdp, string email, int pv_restant_compte, int pv_maximum_compte, int pm_restant_compte, int pm_maximum_compte, int force_compte, int magie_compte, int defense_compte, int po_compte, int pc_compte, String status_compte)
        {
            Id = id;
            Pseudo = pseudo;
            Mdp = mdp;
            Email = email;
            PV_Restant_Compte = pv_restant_compte;
            PV_Maximum_Compte = pv_maximum_compte;
            PM_Restant_Compte = pm_restant_compte;
            PM_Maximum_Compte = pm_maximum_compte;
            Force_Compte = force_compte;
            Magie_Compte = magie_compte;
            Defense_Compte = defense_compte;
            PO_Compte = po_compte;
            PC_Compte = pc_compte;
            Status_Compte = status_compte;
        }
    }
}
Commenter la réponse de caranille
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
248
0
Merci
Salut,

Tu peux te créer un singleton :
http://msdn.microsoft.com/en-us/library/ff650316.aspx

C'est tout bête. C'est un design pattern qui a pour objectif de ne conserver qu'une seule intance d'une même classe.

Pour cela, tu déclares l'instances de la classe en static et tu créés un accesseur sur cette instance. Pour ne pas pouvoir la ré-instancier en dehors de la classe, tu utilises un constructeur privé.
Commenter la réponse de cs_Julien39
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Salut,

La solution de Julien39 est une bonne solution,

mais puisque tu utilises un SqlDataReader, pourquoi ne pas sauvegarder le xml de données, puis le relire à loisir :
Après ton code qui utilise le DataReader

(...)
int Id_Compte = donnees.GetInt32(0);
(...)
DataTable tmpDt =  donnees.GetSchemaTable();
tmpDt.WriteXml("COMPTE.xml", XmlWriteMode.WriteSchema);



// pour relire dans un autre endroit du programme
DataTable tmpDt = new DataTable();
tmpDt.ReadXml("COMPTE.xml");
// exemple de récupération du champ ID_COMPTE
int idCompte = Convert.ToInt32( tmpDt.Rows[0]["ID_COMPTE"] );



bye...
Commenter la réponse de yann_lo_san
Messages postés
13979
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2019
319
0
Merci
Bonjour, tu peux aussi passer l'objet d'un formulaire à l'autre.
Voir cette discussion en exemple


Whismeril
Commenter la réponse de Whismeril
Messages postés
47
Date d'inscription
mardi 21 novembre 2006
Statut
Membre
Dernière intervention
5 novembre 2016
0
Merci
Lorsque j'ai besoin de propriété qui seront utilisées tout le long de mon code, je crée une classe que je nomme 'Statique' et je crée des objects statique à l'interieur
public class Statique
{
   public Compte compte;
}


tu l'appelle ainsi de n'importe où de cette facon :
if (donnees.HasRows) 
{ 
while (donnees.Read()) 
{ 
int Id_Compte = donnees.GetInt32(0); 
string Pseudo_Compte = donnees.GetString(1); 
string Mdp_Compte = donnees.GetString(2); 
string Mail_Compte = donnees.GetString(3); 
int PV_Restant_Compte = donnees.GetInt32(4); 
int PV_Maximum_Compte = donnees.GetInt32(5); 
int PM_Restant_Compte = donnees.GetInt32(6); 
int PM_Maximum_Compte = donnees.GetInt32(7); 
int Force_Compte = donnees.GetInt32(8); 
int Magie_Compte = donnees.GetInt32(9); 
int Defense_Compte = donnees.GetInt32(10); 
int PO_Compte = donnees.GetInt32(11); 
int PC_Compte = donnees.GetInt32(12); 
string Status_Compte = donnees.GetString(13); 
Statique.compte = new Compte(Id_Compte, Pseudo_Compte, Mdp_Compte, Mail_Compte, PV_Restant_Compte, PV_Maximum_Compte, PM_Restant_Compte, PM_Maximum_Compte, Force_Compte, Magie_Compte, Defense_Compte, PO_Compte, PC_Compte, Status_Compte); 
MessageBox.Show("Bienvenue " + Statique.compte.Pseudo); 
} 
}

et lorsque tu en a besoin quelque part
Statique.compte.Status_Compte="..."
Commenter la réponse de soussous78