Q:

Llamar mas de una vez metodo para llenar datagrid C#?

Tengo un metodo para cargar datos a un datagrid, los datos son cargados uno a la vez.
El metodo es llamado desde dos puntos diferentes entonces cuando ya hay un fila cargada y el metodo es llamado desde otro punto se me borra la primer fila y se pone unicamente el dato que se cargo la ultima vez, no entiendo bien esto.  
Desde este metodo mando llamar dos veces el metodo para llenar el datagrid:  
 public void dataTressverify(string HexRFID)
    {
        try
        {
            if (dataGridView1.Rows.Count > 0)
            {
                foreach (DataGridViewRow item in dataGridView1.Rows)
                {
                    string horabef = Convert.ToString(item.Cells["Column2"].Value);
                    string rfid = Convert.ToString(item.Cells["Column3"].Value);
                    string claveup = Convert.ToString(item.Cells["Column4"].Value);
                    if (rfid == HexRFID)
                    {
                        updateTime(format, claveup);
                    }
                    else
                    {

                        getstaffdb(HexRFID);
                    }
                }
            }
            else
            {
                getstaffdb(HexRFID);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: Description...\n" + ex.Message);
        }
    }  

Como pueden ver llamo dos veces al metodo getstaffdb(HexRFID) y esto hace que se me borre la primer fila, lo que busco es que esta nueva fila se agregue debajo de la primera y asi sucesivamente.
Asi es como lleno el datagrid:  
public void getstaffdb(string DataHex)
    {
        conn.Open();
        try
        {
          string query = "my query";
            comm = new SqlCommand(query, conn);
            comm.CommandType = CommandType.Text;
            comm.ExecuteNonQuery();
            reader = comm.ExecuteReader();
            if (reader.Read())
            {

                int addfile = dataGridView1.Rows.Add();
                dataGridView1.Rows[addfile].Cells["Column1"].Value = Nombre;
                dataGridView1.Rows[addfile].Cells["Column2"].Value = datenow;
                dataGridView1.Rows[addfile].Cells["Column3"].Value = Hex;
                dataGridView1.Rows[addfile].Cells["Column4"].Value = id;

            }
            else
            {
        conn.Close();
            }
        }
        catch (Exception ex)
        {
            conn.Close();
            MessageBox.Show(ex.Message);
        }
    }

A:

Aconsejaria estos cambios
Primero defines una clase que agrupen la informacion que obtienes de la consulta a la db
public class DataHexEntity
{
    public string Nombre {get;set;}
    public string datenow {get;set;}
    public string Hex {get;set;}
    public string id {get;set;}
}

El metodo getstaffdb() devolvera datos no accedera al grid agregando la row
public DataHexEntity getstaffdb(string DataHex)
{
    DataHexEntity entity = null;
    string query = "my query";
    SqlCommand comm = new SqlCommand(query, conn);
    var reader = comm.ExecuteReader();

    if (reader.Read())
    {
        entity =new DataHexEntity()
        {
            Nombre = reader["nombre"].ToString();
            datenow = reader["datenow"].ToString();
            Hex = reader["Hex"].ToString();
            id = reader["id"].ToString();
        };
    }

    return entity;
}

Por ultimo cada llamada se asigna a una lista temporal que iterasl al final para agregar las rows al grid
public void dataTressverify(string HexRFID)
{
    try
    {
        List<DataHexEntity> lista = new List<DataHexEntity>();

        if (dataGridView1.Rows.Count > 0)
        {
            foreach (DataGridViewRow item in dataGridView1.Rows)
            {
                string horabef = Convert.ToString(item.Cells["Column2"].Value);
                string rfid = Convert.ToString(item.Cells["Column3"].Value);
                string claveup = Convert.ToString(item.Cells["Column4"].Value);
                if (rfid == HexRFID)
                {
                    updateTime(format, claveup);
                }
                else
                {
                    var entity = getstaffdb(HexRFID);
                    if(entity != null)
                        lista.Add(entity);
                }
            }
        }
        else
        {
            var entity = getstaffdb(HexRFID);
            if(entity != null)
                lista.Add(entity);
        }

        foreach(var item in lista)
        {
            int addfile = dataGridView1.Rows.Add();
            dataGridView1.Rows[addfile].Cells["Column1"].Value = item.Nombre;
            dataGridView1.Rows[addfile].Cells["Column2"].Value = item.datenow;
            dataGridView1.Rows[addfile].Cells["Column3"].Value = item.Hex;
            dataGridView1.Rows[addfile].Cells["Column4"].Value = item.id;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: Description...\n" + ex.Message);
    }
} 

Es por eso que usas
var entity = getstaffdb(HexRFID);
if(entity != null)
    lista.Add(entity);

Para al final iteras los datos de los pasos previos que agregaron la info a la lista
foreach(var item in lista)
{
    int addfile = dataGridView1.Rows.Add();
    var row = dataGridView1.Rows[addfile];
    row.Cells["Column1"].Value = item.Nombre;
    row.Cells["Column2"].Value = item.datenow;
    row.Cells["Column3"].Value = item.Hex;
    row.Cells["Column4"].Value = item.id;
}

