I do not know ASP.NET but C# and your code looks really messy. Therefore, I give you some hints:
1) You should use an own (static or singleton) class to generally communicate with your database wherein you only need 3-4 general methods: Read, Write, WriteMultiple and (optionally) Vacuum.
public static class DB {
private static string _ConnectionString = "...";
public static DataTable Read(DBQuery query) { ... }
public static void Vacuum() { ... }
public static void Write(DBQuery query) { ... }
public static void WriteMultiple(DBQueries queries) { ... }
}
You call those methods (exept Vacuum) with the prepared parameterized DB query (or queries) via your entity class(es), see below.
2) For each entity (e.g. "Attendee" and "Trainings") you should have an own entity class where you define the properties and the corresponding database methods you really need, e.g.: MapFromDB, ReadMaxID, ReadAllFromDB, ReadFromDB, RemoveFromDB, SaveToDB.
Within those database methods you build the corresponding SQL queries and parameters, call the method of the DB class and (when using Read...) map the resulting DataTable back to the entity object(s) via the MapFromDB() method.
You should also think about which entities you want to display and if your approach makes sense. As it seems you use a mix of attendees and trainings, you need an own entity type for this which includes properties of both and database methods that affect 2 different SQL tables at once. Furthermore, I doubt it is reasonable to display the total training hours of an attendee within a list where one attendee can occur multiple times as hereby you need to update all those entries at once. It would be better to use a separate sub GridView to display all trainings for a single attendee and display (and update) the total training hours as header info and/or in a GridView which only displays attendees.
3) Do not bind controls (like a GridView) directly to a database source, instead use (Binding)Lists to work directly with the entity objects and their methods. This is the classic approach which forces you to rework your code but always keeps you in full control when anything is read from or updated on the database.
4) The GridView handling is as follows:
Read all entities from the database and map those to a (Binding)List. Then use/bind this list to your GridView source.
When interacting within the GridView (e.g. edit cells, using command functions, etc.) call separate methods for your GridView wherein you use and manipulate the single entity object of the selected GridView row and, if needed, update or read from the database with the database methods you have in your entity class. A much better approach would even be to use separate add and edit dialogues with a "Save"/"Apply"/"OK" button for any data manipulation.
So, when using command functions within your GridView row, get the single entity by using the ID column of your selected row and then finding the entity via this ID in your (Binding)List. Now, work directly with that single entity.
In your case, within the method RbCompleted_SelectedIndexChanged() (which is triggered when you change the radio button) you need to use the corresponding row index to read the contents of the column "AttendeeID" and/or "TrainingID" to get the corresponding single entity of the GridView datasource (which should be a (Binding)List). When you have it, you can manipulate this single entity and use its database method (e.g. ReadTotalTrainingHours() or UpdateTotalTrainingHours()) to update its property.
By updating the entity the GridView should display the updated value automatically. If not, you need to additionally call the GridView.InvalidateRow() method.
Good luck!