RE:Guardar Datagridview en otra tabla
Lo que supongo que utilizas son DataSet's verdad, mira yo lo que utilizó es mediante código a mano, no utilizao DataSet's ya que estos no permiten mucho manejar la Herencia, en cambio en código a mano si, esto te podria solucionar este problema.
Suponiendo que estes utilizando OleDb, y que las dos tablas que quieres involucrar son Empleado y Empleado2, en donde Empleado tiene los campos, Clave (cadena) y Nombre (cadena), la segunda tabla Empleado2 contendría los dos campos anteriores más los dos siguientes (según lo que tú necesitas): Direccion (cadena), Telefono (cadena), indicando que la llave primaria es Clave.
// cnnDatos sería la conexión que utilizas hacia la base de datos.
OleDbDataAdapter daEmpleado2 = new OleDbDataAdapter("SELECT Clave, Nombre, '' Direccion, '' Telefono FROM Empleado", cnnDatos);
OleDbParameter pm;
OleDbCommand cmmInsEmpleado2 = new OleDbCommand("INSERT INTO Empleado2 (Clave, Nombre, Direccion, Telefono) VALUES (?, ?, ?, ?)");
pm = new OleDbParameter("Clave", OleDbDbType.VarChar, 10, ParameterDirection.Input, false, 0, 0, "Clave", DataRowVersion.Current, string.Empty);
cmmInsEmpleado2.Parameters.Add(pm);
pm = new OleDbParameter("Nombre", OleDbDbType.VarChar, 75, ParameterDirection.Input, false, 0, 0, "Nombre", DataRowVersion.Current, string.Empty);
cmmInsEmpleado2.Parameters.Add(pm);
pm = new OleDbParameter("Direccion", OleDbDbType.VarChar, 50, ParameterDirection.Input, false, 0, 0, "Direccion", DataRowVersion.Current, string.Empty);
cmmInsEmpleado2.Parameters.Add(pm);
pm = new OleDbParameter("Telefono", OleDbDbType.VarChar, 15, ParameterDirection.Input, false, 0, 0, "Telefono", DataRowVersion.Current, string.Empty);
cmmInsEmpleado2.Parameters.Add(pm);
OleDbCommand cmmUpdEmpleado2 = new OleDbCommand("UPDATE Empleado2 SET Clave = ?, Nombre = ?, Direccion = ?, Telefono = ? WHERE Clave = ?");
pm = new OleDbParameter("Clave", OleDbDbType.VarChar, 10, ParameterDirection.Input, false, 0, 0, "Clave", DataRowVersion.Current, string.Empty);
cmmUpdEmpleado2.Parameters.Add(pm);
pm = new OleDbParameter("Nombre", OleDbDbType.VarChar, 75, ParameterDirection.Input, false, 0, 0, "Nombre", DataRowVersion.Current, string.Empty);
cmmUpdEmpleado2.Parameters.Add(pm);
pm = new OleDbParameter("Direccion", OleDbDbType.VarChar, 50, ParameterDirection.Input, false, 0, 0, "Direccion", DataRowVersion.Current, string.Empty);
cmmUpdEmpleado2.Parameters.Add(pm);
pm = new OleDbParameter("Telefono", OleDbDbType.VarChar, 15, ParameterDirection.Input, false, 0, 0, "Telefono", DataRowVersion.Current, string.Empty);
cmmUpdEmpleado2.Parameters.Add(pm);
pm = new OleDbParameter("Original_Clave", OleDbDbType.VarChar, 10, ParameterDirection.Input, false, 0, 0, "Clave", DataRowVersion.Original, string.Empty);
cmmUpdEmpleado2.Parameters.Add(pm);
daEmpleado2.InsertCommand = cmmInsEmpleado2;
daEmpleado2.UpdateCommand = cmmUpdEmpleado2;
DataTable dtEmpleado2 = new DataTable("Empleado2");
daEmpleado2.Fill(dtEmpleado2);
dataGridView.DataSource = dtEmpleado2;
Disculpa todo el rollo pero haber si esto te funciona, si te fijas al instancia el adaptador, establezco como la propiedad SelectCommand, la consulta hacia la tabla de donde quieres obtener los registros, en este le agregue las dos columnas que quieres que se muestren dentro de la misma consulta SQL (esto me ahorra el rollo de agregárselas por medio de código). En los comandos que se encargan de guardar la información, establezo que se lleven a cabo en la tabla en donde quieres que se guarden Empleado2.
Si utilizas DataSet, y si estos los generaste por medio del asistente, te recomiendo que cheques el código que te genera para que puedas cambiar la información tú manualmente.
Espero y esto te ayude.
Saludos.