Static et private [Résolu]

Signaler
Messages postés
60
Date d'inscription
dimanche 10 novembre 2002
Statut
Membre
Dernière intervention
30 juin 2011
-
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
-
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

Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
29
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!
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
29
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!
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
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
*/
Messages postés
60
Date d'inscription
dimanche 10 novembre 2002
Statut
Membre
Dernière intervention
30 juin 2011

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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
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
*/
Messages postés
60
Date d'inscription
dimanche 10 novembre 2002
Statut
Membre
Dernière intervention
30 juin 2011

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
Messages postés
60
Date d'inscription
dimanche 10 novembre 2002
Statut
Membre
Dernière intervention
30 juin 2011

Super, je vais essayer merci

Nicolas
Messages postés
60
Date d'inscription
dimanche 10 novembre 2002
Statut
Membre
Dernière intervention
30 juin 2011

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