To avoid reconstruction when refreshing grid's record source, you require to assign empty string (not a one space - " ", but empty string - "") to the Record source before any of grid's record source refresh actions described above. If you already do that, just check your code if you do that in correct order or any other thing does not spoil the correct order of refreshing process. After refresh assign record source to grid again.
In order to reset the grid recordsource dynamically set the recordsourcetype to Alias(1), and use the grid refresh method. Call the grid refresh method every time you need to update the data. In the grid refresh use something like:
thisform.grid1.recordsource="" && To avoid reconstruction select * from table2 where table2.key=field2 INTO myCursor thisform.grid1.recordsource="myCursor" DODEFAULT() && To do the rest of the refresh