code: def InitSiteCheck(self):
          
          # propagate average lat/lon info from samples table if
          # available in samples and missing in sites
          self.contribution.propagate_average_up(cols=['lat', 'lon', 'height'],
                                         target_df_name='sites',
                                         source_df_name='samples')
          # propagate lithology columns
          self.contribution.propagate_lithology_cols()
  
          site_df = self.contribution.tables['sites'].df
          self.panel = wx.Panel(self, style=wx.SIMPLE_BORDER)
          self.grid_frame = grid_frame3.GridFrame(self.contribution, self.WD,
                                                  'sites', 'sites', self.panel,
                                                   main_frame=self.main_frame)
          # redefine default 'save & exit grid' button to go to next dialog instead
          self.grid_frame.exitButton.SetLabel('Save and continue')
          grid = self.grid_frame.grid
          self.grid_frame.Bind(wx.EVT_BUTTON,
                               lambda event: self.onContinue(event, grid, self.InitLocCheck),
                               self.grid_frame.exitButton)
          # add back button
          self.backButton = wx.Button(self.grid_frame.panel, id=-1, label='Back',
                                        name='back_btn')
          self.Bind(wx.EVT_BUTTON,
                    lambda event: self.onbackButton(event, self.InitSampCheck),
                    self.backButton)
          self.grid_frame.main_btn_vbox.Add(self.backButton, flag=wx.ALL, border=5)
          # re-do fit
          self.grid_frame.do_fit(None, self.min_size)
          # center
          self.grid_frame.Centre()
          return
docs: make an interactive grid in which users can edit site names
          as well as which location a site belongs to