views:

204

answers:

4

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?!

A: 

Here you have "The Simplest C# Events Example Imaginable".

thelost
Can you re-write? I can't tell if you are trying to link me to something or what....
Matt
"Here" is the link to the resource.
thelost
A: 

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...

Martin Milan
+5  A: 

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

Justin Niessner
From MSDN Event Naming Guidelines: "Do not use a prefix or suffix on the event declaration on the type. For example, use Close instead of OnClose."
João Angelo
Sorry for another question but whenever I populate my frame do I just make a call to FramePopulated then to trigger the event?
Matt
@Matt Yes. I added it to the code above.
Justin Niessner
Thanks Justin! Appreciate the help...
Matt
A: 

    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);
        }
    }
Asher