Also there is no real compelling reason to return a strongly typed IDictionary Let me know if you find any bugs.
Unfortunately these dictionaries are only filled out if you are bound to a datasource control :(.
So that means when you bind to some raw collection and hook up to the Data Source property then call databind, if you try to handle the delete or update events these dictionaries are going to be empty.
If you go with the flow, you probably won't get stuck, but the moment you try to go against the grain you end up with a hand full of thorns.
Most of the data controls have events ending in ing and ed e.g. In most of the event handlers of the ing events it is easy to get the values from the event args.
I have a Grid View control and use old style manual binding with a Data Source property and invoke the Data Bind() method.
If you don't use one of the Data Source controls, you are required to handle the Row Updating event.
So I decided to instead put the code in an assembly and make available for download here.
event is raised when a row's Edit button is clicked, but before the Grid View control enters edit mode.
If you can, use 2 way databinding, if your control doesn't have a useful property to bind against and you need to do some more logic to get the right value then use Find Control.
Edit: I've updated the code to loop over the Cells collection instead of the Controls collection (which is alot cleaner).
Forgive me for the variation in my code formatting I'm trying to find the right one.