When you update DataGridView.DataSource using the assignment operator, the DataSourceChanged event handler is called. You can't overload assignment op in C#, so how does the event handler get called internally?

It's not exactly clear what you're asking. If you're asking how the property setter can do something: a property setter is a method. It works like any other method. In this case, when the property setter is called it checks to see if it needs to raise the event, and if it does, then it raises the event.

If you're asking how the event itself is implemented, Jon's article is of course excellent. If you are looking for additional technical analysis of how events are implemented in C#, and how the implementation has changed over time, see Chris Burrows' blog articles on the topic:

It's up to the event exactly what it does, but I think of events as like properties - except instead of a getter and a setter, you have add and remove actions, each of which take the delegate to subscribe or unsubscribe to/from the event.

A field-like event in C# implements the event using a field for a delegate, and fixed add/remove implementations - a bit like an automatically implemented property. But you can do whatever you like in an add or remove handler.

The event handler gets called internally because the class providing the event, in this case DataGridView explicitly fires the event at some point within it's code. The property setter for the DataSource sounds like an appropriate place to fire this particular event, although I didn't look int he source code to verify exactly.

I'd suggest looking up a simple tutorial on how to provide your own event for another class. It will give you a better idea of how the provider of an event needs to work without too much of the nitty gritty details.