C#: Need one of my classes to trigger an event in another class to update a text box
Total n00b to C# and events although I have been programming for a while.
I have a class containing a text box. This class creates an instance of a communication manager class that is receiving frames from the Serial Port. I have this all working fine.
Every time a frame is received and its data extracted, I want a method to run in my class with the text box in order to append this frame data to the text box.
So, without posting all of my code I have my form class...
public partial class Form1 : Form
{
CommManager comm;
public Form1()
开发者_高级运维 {
InitializeComponent();
comm = new CommManager();
}
private void updateTextBox()
{
//get new values and update textbox
}
.
.
.
and I have my CommManager class
class CommManager
{
//here we manage the comms, recieve the data and parse the frame
}
SO... essentially, when I parse that frame, I need the updateTextBox method from the form class to run. I'm guessing this is possible with events but I can't seem to get it to work.
I tried adding an event handler in the form class after creating the instance of CommManager as below...
comm = new CommManager();
comm.framePopulated += new EventHandler(updateTextBox);
...but I must be doing this wrong as the compiler doesn't like it...
Any ideas?!
Your code should look something like:
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();
}
}
And here's a link to the .NET Event Naming Guidelines mentioned in the comments:
MSDN - Event Naming Guidelines
Here you have "The Simplest C# Events Example Imaginable".
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);
}
}
Yes - change the signature of updateTextBox to :
private void updateTextBox(object sender, Eventargs ea)
Although that might not be the best design. Things would look a lot neater if you wrote a proper event handler, and then called updateTextBox from there...
精彩评论