This is not standard behavior. For example, I do not see it in this sample that has a GridDataBoundGrid and a Button on a form.
ForumSampleFocus_3764.zip
So, to get things to work, you may have to identify what is interfering with the default behavior.
The normal things you can do to force the grid to save values would be to call
grid.CurrentCell.EndEdit();
grid.Binder.EndEdit();
But this may not be sufficient if there is something interfering with the saving process. You might try listening to the grid.Leave event and see if that is being hit in this case. If so, you could try doing the two calls above to see if that handles things.
You might look through your code for calls to CancelEdit as that would be something that would throw away changes and restore the old value.