I also tried storing the original grid in a Session variable, like this:

Session["grd_Orig"] = grd;

But so far none of this has worked: the grid always breaks at 2nd reorder and it looks like it's not rebuilding its original indexes.
Is there another way to do this?
Data comes from a MSSQL Database, and I'm not allowed to use any 3rd party component.