Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#] Accès à un form depuis une autre classe.

Anonyme
    8 novembre 2011 à 14:20:36

    Bonjour,

    Je viens de réaliser deux petits softs : un client et un serveur.
    Ils ont l'air de communiquer convenablement mais j'aimerais afficher les requêtes que je reçois sur le serveur.

    Par exemple si le client envoie "Georges Abitbol", j'aimerais que ce texte soit affiché dans le label1 du Form1 sur le serveur.

    Je ne sais pas comment accéder à ce label depuis ma classe TCPServer. J'ai essayé en lui passant l'instance du Form en paramètre mais je rencontre un problème de thread lors de la modif du label1.

    J'ai aussi tenté un accès direct via Form1.lablel1.Text = "..." mais sans succès.

    Comment puis-je simplement modifier ce label dans mon Form principal depuis une classe annexe ?
    Merci :)

    Form1.cs
    namespace Server
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                TCPServer server = new TCPServer();
                InitializeComponent();
            }
        }
    }
    


    TCPServer.cs
    namespace Server
    {
        class TCPServer
        {
            private TcpListener tcpListener;
            private Thread listenThread;
    
            public TCPServer()
            {
                this.tcpListener = new TcpListener(IPAddress.Any, 3000);
                this.listenThread = new Thread(new ThreadStart(ListenForClients));
                this.listenThread.Start();
            }
    
            private void ListenForClients()
            {
                [...]
            }
    
            private void HandleClientComm(object client)
            {
                [...]
                // C'est ici que je bloque
                Form1.label1.Text = encoder.GetString(message, 0, bytesRead);
                tcpClient.Close();
            }
        }
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      8 novembre 2011 à 14:43:04

      Typiquement, ta classe TCPServer doit posséder des événements auxquels ta form pourra s'abonner et qui seront déclenchés lorsque ta classe TCPServer a quelque chose à signaler.

      Pense au fonctionnement d'un simple bouton par exemple: lorsqu'on clique sur un bouton, il se contente de déclencher son événement Click. Il ne possède pas de référence vers une form, et il n'essaie certainement pas de modifier le contenu d'une form. Au contraire, c'est la form qui "décide" d'écouter l'événement Click, et qui fait le nécessaire lorsqu'il est déclenché. C'est pareil ici*. ;)

      * A ceci près que ta classe TCPServer déclenchera certainement ses événements dans un thread secondaire, donc au moment de traiter ces événements ta form devra veiller à repasser dans le thread principal (grâce à sa méthode BeginInvoke) avant de modifier ses contrôles.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        8 novembre 2011 à 14:54:49

        Merci, j'y vois déjà plus clair.
        Je vais essayer d'écouter et déclencher des évènements. :)
        • Partager sur Facebook
        • Partager sur Twitter

        [C#] Accès à un form depuis une autre classe.

        × 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