code: def onContinue(self, event, grid, next_dia=None):#, age_data_type='site'):
          
          # deselect column, including remove 'EDIT ALL' label
          if self.grid_frame.drop_down_menu:
              self.grid_frame.drop_down_menu.clean_up()
  
          # remove '**' and '^^' from col names
          #self.remove_starred_labels(grid)
          grid.remove_starred_labels()
  
          grid.SaveEditControlValue() # locks in value in cell currently edited
          grid_name = str(grid.GetName())
  
          # save all changes to data object and write to file
          self.grid_frame.grid_builder.save_grid_data()
  
          # check that all required data are present
          validation_errors = self.validate(grid)
          if validation_errors:
              warn_string = ""
              for error_name, error_cols in list(validation_errors.items()):
                  if error_cols:
                      warn_string += "You have {}: {}.\n\n".format(error_name, ", ".join(error_cols))
              warn_string += "Are you sure you want to continue?"
              result = pw.warning_with_override(warn_string)
              if result == wx.ID_YES:
                  pass
              else:
                  return False
          else:
              wx.MessageBox('Saved!', 'Info',
                            style=wx.OK | wx.ICON_INFORMATION)
  
          self.panel.Destroy()
          if next_dia:
              next_dia()
          else:
              # propagate any type/lithology/class data from sites to samples table
              # will only overwrite if sample values are blank or "Not Specified"
              self.contribution.propagate_lithology_cols()
              wx.MessageBox('Done!', 'Info',
                            style=wx.OK | wx.ICON_INFORMATION)
docs: Save grid data in the data object