Partage
  • Partager sur Facebook
  • Partager sur Twitter

Remplir un objet de formulaire dans une méthode static

Sujet résolu
    4 février 2012 à 16:09:17

    Bonjour,

    J'explique mon cas : dans mon projet C# j'ai un formulaire dans lequel j'ai une DataGridView. Dans le constructeur de ce formulaire je lance un thread qui fait appel à une méthode static de ce même formulaire. Dans cette méthode je souhaite remplir la DataGridView que j'ai nommé DataGridViewA, le problème c'est que quand je l'utilise dans ma méthode j'ai l'erreur suivante :
    "Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique..."

    Comment faire pour utiliser ma DataGrid dans dans une méthode static?

    Je rajoute mon code :

    public partial class Accueil : Form
        {
            static TcpClient ClientTcp;
            static StreamReader lecture;
            static NetworkStream flux;
            static StreamWriter Ecriture;
    
    
            public Accueil()
            {
                InitializeComponent();
                string NomServeur; NomServeur = "localhost";
                int NumPort; NumPort = 1050;
                try
                {
                    ClientTcp = new TcpClient(NomServeur, NumPort);
                    //ThreadPool.QueueUserWorkItem(Service);
                    Thread lance_service;
                    lance_service = new Thread(new ThreadStart(Service));
                    lance_service.Start();
                }
                catch (Exception arg) { MessageBox.Show(arg.Message); }
            }
            public static void Service()
            {
                string server_request;
                server_request = "INIT";
    
                flux = ClientTcp.GetStream();
    
                try
                {
                    Ecriture = new StreamWriter(flux);                          // Préaffectation Sortie 
                    Ecriture.AutoFlush = true;                                  // Inhibition bufférisation sortie (évite le désagrément d'écriture non activée sur le serveur).
                    lecture = new StreamReader(flux);                           // Préaffectastion Entrée à partir du flux général.      
                    Ecriture.WriteLine("ACC;");                
                    while (true)
                    {
                        server_request = lecture.ReadLine();
                        //MessageBox.Show(server_request);
                        if (server_request.StartsWith("ACC;"))
                        {
                            string[] str = server_request.Split(';');
                            dataGridViewAcc.Rows.Add(str[1], str[2], str[3], str[4], str[5], str[6], str[7], str[8]);
                        }
                    }//Fin while
                }
                catch (Exception argument)
                {
                    MessageBox.Show(argument.Message);
                }
            }
        }
    }
    


    En espérant trouver la solution
    Cdt.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      4 février 2012 à 16:38:48

      Je vais commencer par ne pas répondre à ta question et me concentrer sur le code en lui-même :
      • Nomme toutes tes variables locales en camelCasing, sans soulignés _. Par exemple, string serverName = "google.com";
      • Nomme les champs privés en camelCase, avec ou sans préfixe. Par exemple, private TcpClient _client;
      • C# != C. Les variables peuvent être initialisées lors de leur déclaration : string nomServeur = "localhost";
      • Evite les try..catch qui ne font que montrer le message de l'exception ; en debugging, tu préfèreras voir l'intégralité de l'exception avec la stack trace et les exceptions internes, et hors du debugging ça ne sert pas à grand-chose. Si tu veux logger toutes les exceptions, crée un handler pour AppDomain.CurrentDomain.UnhandledException.



      Pour revenir à ton problème, la solution est simple : n'utilise pas une méthode static. Pourquoi veux-tu qu'elle soit static ?
      • Partager sur Facebook
      • Partager sur Twitter
        4 février 2012 à 17:01:44

        Merci Aethec pour ton aide,

        Donc si je n'utilise pas de méthode static j'ai donc bien accès à ma datagrid, le problème survient lord de l’exécution, j'ai cette erreur :

        "opération inter-thread non valide : le controle 'dataGridViewAcc' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été crée."
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          4 février 2012 à 17:28:20

          Si je me souviens bien, utiliser un BackgroundWorker au lieu d'un Thread permet d'éviter ça.
          Le BackgroundWorker s'utilise en assignant un handler à son event DoWork et en appelant RunWorkerAsync dessus.
          • Partager sur Facebook
          • Partager sur Twitter
            4 février 2012 à 18:31:47

            Merci pour ton aide Aethec,

            J'ai trouver ma solution, il faut utiliser une méthode delegate, donc j'ai suivi exactement ce tutoriel :
            http://drq.developpez.com/dotnet/articles/threads/#L5

            Et cela marche impeccablement!
            • Partager sur Facebook
            • Partager sur Twitter
              4 février 2012 à 19:05:29

              C'est marrant comme cette subtilité dans l'utilisation des threads induit les gens en erreur en ce qui concerne la nature des delegates.

              Ce n'est pas l'utilisation d'un delegate qui a résolu ton problème, c'est l'utilisation de la méthode Invoke() - qui demande effectivement un delegate en paramètre. C'est très différent. ;)

              Le rôle de cette méthode est en fait de demander au thread principal d'exécuter la méthode désignée par le delegate que tu lui donnes, et comme il est le seul à pouvoir modifier les contrôles de ton formulaire, ça explique pourquoi le code ne plante plus.
              • Partager sur Facebook
              • Partager sur Twitter
                4 février 2012 à 19:15:51

                Citation : Aethec

                Si je me souviens bien, utiliser un BackgroundWorker au lieu d'un Thread permet d'éviter ça.
                Le BackgroundWorker s'utilise en assignant un handler à son event DoWork et en appelant RunWorkerAsync dessus.



                Nope. Utilisé un BackgroundWorker est mieux car plus simple à utiliser, mais si tu interagie avec un contrôle de l'interface, il faut faire de l'invoke sur le contrôle.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  4 février 2012 à 20:08:54

                  Citation : M4N!aC

                  Citation : Aethec

                  Si je me souviens bien, utiliser un BackgroundWorker au lieu d'un Thread permet d'éviter ça.
                  Le BackgroundWorker s'utilise en assignant un handler à son event DoWork et en appelant RunWorkerAsync dessus.



                  Nope. Utilisé un BackgroundWorker est mieux car plus simple à utiliser, mais si tu interagie avec un contrôle de l'interface, il faut faire de l'invoke sur le contrôle.


                  Effectivement, j'avais mal lu. http://msdn.microsoft.com/en-us/library/ms171728.aspx dit que c'est possible, mais...en utilisant l'évènement RunWorkerCompleted. Moi pas comprendre intérêt.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 février 2012 à 20:18:52

                    C'est surtout l'événement ProgressChanged qui servira dans ce cas-là ; l'événement RunWorkerCompleted c'est pour reprendre la main dans le thread principal à la fin du job. :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 février 2012 à 21:21:57

                      Re,

                      Merci pour vos précisions même si parfois je comprend pas grand chose, j'ai pas le même niveau là...

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Remplir un objet de formulaire dans une méthode static

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown