This is a confusing issue. Here's a recap of the process:
Think about what it would be like if you were not defining the BankAccount class. For example, if Microsoft provided it in the Toolbox. In that case, the class would define the Overdrawn event. Your program would create an event handler to catch that event and take action.
So the event is defined by the class, but the event handler is defined outside of it. (Actually it could catch its own events, too, but that would be fairly unusual and advanced so let's stick to the normal case.)
Inside its code, this class does four event-related things:
1. It defines the OverdrawnEventArgs class that is uses to pass data to the event handler. (That's the convention. If you only want to pass int or string data, you can skip this.)
2. It uses the "delegate" keyword to declare a delegate representing the kind of method that the event handler must be. It's basically a data type that happens to be a method instead of a number or whatever. In this case, it's a data type named OverdrawnEventHandler which is a method that takes "object sender, OverdrawnEventArgs args" as parameters and returns void (nothing).
3. It uses the "event" keyword to declare the event. In this example, it says there is a public event named "Overdrawn" that can be handled by a method of the type OverdrawnEventHandler.
4. Finally it should raise the event somewhere. The code looks like it calls the Overdrawn event. Really what it is doing is telling the system to look for any registered event handlers and invoke them, passing them the indicated parameters.
So to your questions:
I am having a lot of difficulty distinguishing between the actual event and the event handler in this class...
The class defines the type of the event handler but doesn't actually contain one. The main program contains event handlers to catch the class's events.
I get that the code "Overdrawn(this,args)" raises the event...
but hwo does it do that? It looks like it passes the class to the event?..
The syntax looks like that but it really is telling the system, "Go find all registered event handlers and call them, passing them these parameters."
It might have been a little clearer if Microsoft had chosen a different syntax that made the difference more obvious between calling a method and firing an event. (In Visual Basic, you use the RaiseEvent keyword so it's pretty obvious.)
I hope that helps. Let me know if you need more information or if I've missed the point of your question.