code: def onDeleteRow(self, event, data_type):
          
          ancestry = self.er_magic_data.ancestry
          child_type = ancestry[ancestry.index(data_type) - 1]
          names = [self.grid.GetCellValue(row, 0) for row in self.selected_rows]
          if data_type == 'site':
              how_to_fix = 'Make sure to select a new site for each orphaned sample in the next step'
          else:
              how_to_fix = 'Go back a step and select a new {} for each orphaned {}'.format(data_type, child_type)
  
          orphans = []
          for name in names:
              row = self.grid.row_labels.index(name)
              orphan = self.er_magic_data.delete_methods[data_type](name)
              if orphan:
                  orphans.extend(orphan)
              self.grid.remove_row(row)
          if orphans:
              orphan_names = self.er_magic_data.make_name_list(orphans)
              pw.simple_warning('You have deleted:\n\n  {}\n\nthe parent(s) of {}(s):\n\n  {}\n\n{}'.format(', '.join(names), child_type, ', '.join(orphan_names), how_to_fix))
  
          self.selected_rows = set()
  
          # update grid and data model
          self.update_grid(self.grid)#, grids[grid_name])
  
          self.grid.Refresh()
docs: On button click, remove relevant object from both the data model and the grid.