I noticed that DynamicInvoke is used for the custom events. Why use DynamicInvoke, which is a late-bound function? Why not just do something like this:
public event EventHandler<GridViewInsertEventArgs> RowInserting;
protected virtual void OnRowInserting(GridViewInsertEventArgs args)
if (this.RowInserting != null)
Code is shorter and it's early bound.