C #: il faut que l’une de mes classes déclenche un événement dans une autre classe pour mettre à jour une zone de texte

Total n00b à C # et événements bien que je programme depuis longtemps.

J’ai une classe contenant une zone de texte. Cette classe crée une instance d’une classe de gestionnaire de communication qui reçoit des trames du port série. J’ai tout cela fonctionne bien.

À chaque fois qu’un cadre est reçu et que ses données sont extraites, je souhaite qu’une méthode s’exécute dans ma classe avec la zone de texte afin d’append ces données à la zone de texte.

Donc, sans poster tout mon code, j’ai ma classe de formulaire …

public partial class Form1 : Form { CommManager comm; public Form1() { InitializeComponent(); comm = new CommManager(); } private void updateTextBox() { //get new values and update textbox } . . . 

et j’ai ma classe CommManager

 class CommManager { //here we manage the comms, recieve the data and parse the frame } 

SO … Essentiellement, lorsque j’parsing ce cadre, j’ai besoin de la méthode updateTextBox de la classe de formulaire à exécuter. Je suppose que c’est possible avec les événements mais je n’arrive pas à le faire fonctionner.

J’ai essayé d’append un gestionnaire d’événements dans la classe de formulaire après avoir créé l’instance de CommManager comme ci-dessous …

  comm = new CommManager(); comm.framePopulated += new EventHandler(updateTextBox); 

… mais je dois le faire mal car le compilateur ne l’aime pas …

Des idées?!

Votre code devrait ressembler à quelque chose comme:

 public class CommManager() { delegate void FramePopulatedHandler(object sender, EventArgs e); public event FramePopulatedHandler FramePopulated; public void MethodThatPopulatesTheFrame() { FramePopulated(); } // The rest of your code here. } public partial class Form1 : Form { CommManager comm; public Form1() { InitializeComponent(); comm = new CommManager(); comm.FramePopulated += comm_FramePopulatedHander; } private void updateTextBox() { //get new values and update textbox } private void comm_FramePopulatedHandler(object sender, EventArgs e) { updateTextBox(); } } 

Et voici un lien vers les instructions de nommage d’événements .NET mentionnées dans les commentaires:

MSDN – Consignes de dénomination d’événements

Vous avez ici “L’exemple le plus simple des événements C # imaginables”.

 public partial class Form1: Form { CommManager comm; public Form1() { InitializeComponent(); comm = new CommManager(); comm.OnFramePopulated += new EventHandler(updateTextBox); } private void updateTextBox(object sender, EventArgs ea) { //update Textbox } } class CommManager { public EventHandler OnFramePopulated; public void PopulateFrame() { OnFramePopulated(this, null); } } 

Oui – remplacez la signature de updateTextBox par:

 private void updateTextBox(object sender, Eventargs ea) 

Bien que cela puisse ne pas être le meilleur design. Les choses auraient l’air beaucoup plus ordonnées si vous écriviez un bon gestionnaire d’événements, puis appelez updateTextBox à partir de là …