Static et private

Résolu
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011 - 31 oct. 2010 à 18:53
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 - 21 nov. 2010 à 19:37
Bonjour.

Petit soucis.

J'ai déclaré dans ma première classe cette méthode qui est appelée par d'autres classes :

public static void Aff_Status_Comm()
{
//Mise à jour de l'affichage des status
for (int i = 0; i < Data_Comm.Rows.Count; i++)
{
Data_Comm[2, i].Value = Status_Comm(Data_Comm[4, i].Value.ToString());
}
}


Data_Comm est un datagridview et, l'erreur me dit : "Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'HermesAdmin.Frm_Main.Data_Comm"

Déjà, un GRAND merci d'avance.


PS: depuis les autres classes, j'appele cette méthode de cette manière " Frm_Main.Aff_Status_Comm();

8 réponses

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
1 nov. 2010 à 15:26
Bonjour

il y a plusieurs moyens de faire ça
un d'eux est de définir un pointeur static sur la classe, visible de l'exterieur


public static readonly Frm_Main _instance;

public Frm_Main()
{
_instance = this;
InitializeComponent();
}


puis tu enleves le static de la methode

public void Aff_Status_Comm()
{
// attention, on ne sait pas d'ou vient l'appel
if (InvokeRequired)
Invoke(new MethodInvoker(Aff_Status_Comm));
else
{
//Mise à jour de l'affichage des status 
for (int i = 0; i < Data_Comm.Rows.Count; i++)
{
Data_Comm[2, i].Value = Status_Comm(Data_Comm[4, i].Value.ToString());
}
}
}


enfin depuis l'exterieur tu peux appeler la méthode via l'instance static

Frm_Main._instance.Aff_Status_Comm()



Bob
C# is amazing, enjoy it!
3
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
21 nov. 2010 à 19:37
Bonsoir electro

En effet l'objet "MethodInvoker" est une facilité évitant de déclarer des Delegates
C'est un Delegate générique utilisable pour les méthodes void sans paramètres.
Dans tous les autres cas il faut déclarer un Delegate pour la méthode Invoke, ce Delegate doit avoir la même signature que la fonction à appeler.

Ex dans ton cas

    //Déclaration du Delegate
    // à mettre au niveau de la class contenant la fonction à déléguer
    public delegate void Aff_Status_CommDelegate(object Obj);


Modification de l'appel pour passer les paramètres
La méthode Invoke étant générique, les paramètres sont passés sous forme d'un tableau d'objets
Attention à l'ordre, ce doit être le même que ceux de la fonction.
Attention, le type des paramètres ne peut pas être testé par le compilateur, en cas d'erreur c'est à l'exécution que tu auras une erreur.

public void Aff_Status_Comm(object Obj) 
{
    // attention, on ne sait pas d'ou vient l'appel
    if (InvokeRequired)
        Invoke(new Aff_Status_CommDelegate(Aff_Status_Comm), new object[] { Obj });
    else
    {
        ....


Voila ça devrait marcher
Bon code
Bob.

C# is amazing, enjoy it!
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 oct. 2010 à 19:06
Bonjour,

Comme le dit le message, une méthode static d'une classe ne peut mettre à jour la valeur d'un champ d'instance de cette classe, sans utiliser une référence vers cette instance.
Donc ici soit la méthode ne devrait pas être static, soit le champ devrait l'être.


/*
coq
CoqBlog
*/
0
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011
31 oct. 2010 à 19:45
Salut.

Jusque la, je suis 100% d'accord avec toi alors, peux-tu m'aider?

Comment appeler une méthode d'une classe à partir d'une autre sans utiliser le static?
Comment déclarer un champ, en l'occurence un datagridview en static?

Merci


Nicolas
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 oct. 2010 à 20:31
Si c'est un DataGridView alors il n'y a aucune chance qu'il faille le passer static.
La méthode ne doit donc pas l'être, et elle devra être appelée sur l'instance du formulaire qui sera visé par l'action.
Il faut donc mettre en oeuvre un transfert de cette référence d'un formulaire à l'autre (ou basculer sur la définition d'un évènement si c'est plus approprié).


/*
coq
CoqBlog
*/
0
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011
31 oct. 2010 à 20:42
Déjà pour commencer, merci pour les rapidités des tes réponses....

Pour le datagridview, je m'en doutais.

Pour le reste, je dois t'avouer que c'est un peu du petit chinois pour moi, ça ne fait que très peu de temps que je fais du C#.

En fait, c'est une méthode de mise à jour de différents status qui sont gérés dans une autre classe qui, par la même occasion sont des autres threads (pourquoi faire simple)...... Le but est que dans certaines conditions, une cellule du datagridview change de valeure mais, cela peut ce passer depuis la première classe ou depuis la seconde voir peut-être plus tard depuis une troisième.

En fait, dans les classes, je mets à jour un dictionnary avec l'index de la ligne du datagridview et, la nouvelle valeure(string) à afficher. A chaque changement dans le dictionnary, j'appele la méthode pour actualiser l'affichage.

En parlant de code pas propre, je pensais tout simplement appeler la méthode par un thread qui actualise tout les X temps mais, si possible autrement.

MErci


Nicolas
0
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011
1 nov. 2010 à 15:54
Super, je vais essayer merci

Nicolas
0
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011
21 nov. 2010 à 12:45
Merci encore, je suis presque ok....

Juste un détail:

public void Aff_Status_Comm()


j'ai du modifier ma méthode en passant un paramètre

public void Aff_Status_Comm(object Obj)

J'ai donc modifier la suite comme ceci:

Invoke(new MethodInvoker(Aff_Status_Comm),obj);

Mais la: "Aucunes surcharge pour "Aff_Status_Comm" ne corresspond au délégué.............

Un petit coup de main??

Merci

Nicolas
0
Rejoignez-nous