Référencement d’éléments Windows Form dans d’autres classes

Je suis très nouveau dans la programmation Windows Form et je rencontre un problème.

J’ai un formulaire Windows, Form1 , avec une zone de texte: tbx_Log .

Dans une autre classe du même projet, je souhaite écrire quelque chose dans la zone de texte du journal, mais je ne peux pas faire référence à tbx_Log dans cette classe. Comment puis-je atteindre cet objective?

L’access aux objects à l’intérieur d’autres instances de classe (objects) constitue un mauvais style et constitue une violation de l’encapsulation de données. Ajouter une méthode à Form1 :

 public void SetLogText(Ssortingng text) { tbx_Log.Text = text; } 

De cette façon, vous pouvez modifier l’implémentation de la méthode en utilisant un autre contrôle ou en vous connectant à un fichier ultérieurement, sans avoir à modifier tous les sites d’appels. Essayez toujours d’avoir le code en dehors de la classe pour ne pas savoir ce qu’il contient. L’implémentation de classe doit être une “boîte noire” pour le code extérieur.

Vous devez soit rendre la zone de texte publique (non recommandé), soit append une méthode publique à votre classe de formulaire permettant d’écrire une chaîne dans la zone de texte (mieux).

 public class Form1 { protected Textbox tbx_Log; public void Log(ssortingng str) { tbx_Log.Text += str + Environment.NewLine; } } public class Program { private void DoStuff() { Form1 myForm = new Form1(); //Make form visible, etc... myForm.Log("Test Log"); } } 

Je suggérerais que vous créiez une méthode sur la classe Form qui écrit dans la zone de texte du journal. Ensuite, vous transmetsortingez cette méthode en tant que délégué (rappel) à votre classe autre que Form. Cela vous donne plus de flexibilité sur la route. Par exemple, si vous souhaitez appeler la même classe à partir d’une autre classe et que vous souhaitez modifier les informations de journalisation, telles que l’écrire dans un fichier, vous pouvez simplement passer une fonction de rappel différente.

Plutôt que de faire référence à tbx_Log directement, je suggérerais au moins d’append une méthode à votre formulaire qui est responsable de la mise à jour. Vous pouvez ensuite donner à votre classe une référence au formulaire et lui demander d’appeler la fonction de journalisation des formulaires, qui ajoute le texte à la zone de texte.

J’ai au moins dit, car vous voudriez probablement définir une interface et avoir votre formulaire ou plus tard une classe de journalisation plus spécifique qui implémente l’interface et que votre classe interagisse avec tout ce qui implémente l’interface définie.

Vous pouvez créer une méthode publique sur votre formulaire. Et sécurisez également les threads au cas où il est appelé à partir d’un thread différent du thread d’interface utilisateur.

La manière dont l’autre classe accède à votre méthode dépend du fonctionnement de votre application et de la relation entre la classe de formulaire et votre autre classe.

 public void SetText(ssortingng text) { // InvokeRequired required compares the thread ID of the // calling thread to the thread ID of the creating thread. // If these threads are different, it returns true. if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.tbx_Log.Text = text; } } 

Pour obtenir un exemple complet et une explication des appels thread-safe sur les winforms, consultez MSDN , qui indique également comment utiliser BackgroundWorker afin de garantir la sécurité des threads, méthode privilégiée.