It sounds like just some extra housekeeping that the grid is doing. From the grid's point of view, it doesn't know where your going after you leave it, or what your going to do (like move the record pointer). This being the case, the best bet would be to fire any code that would prevent the move in the Valid, then if it's Ok to move, fire any housekeeping code that might be in the BeforeRowColChange.
The reverse of that would be true for the When/AfterRowColChange, where it has no idea if you already changed the record pointer before giving focus to the grid.
Or I may be completely wrong. :- )
Tyson Bonn