J'ai un premier form principal comme suite : 
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Query.Internal;

namespace TP_Evaluation_Forms_IMBAUD_Florian
{
    public partial class Form1 : Form
    {
        int indexMinCourant = 0;
        int nombreAffichages = 0;
        int indexMin = 1;
        int indexMax = 0;

        bool popupDebut = false;
        bool popupFin = false;
        //bool apparenceSourisBloquee = false;
        private bool boutonsDesactives = false;
        public bool modificationsEnCours = false;

        public Form1()
        {
            InitializeComponent();


            // tant qu'aucun intem de boiteListeAffichageTables n'est sélectionné, on ne peut pas sélectionner des boutons : on les désactive

            if (boiteListeAffichageTables.SelectedIndex == -1)
            {
                DesacitverTousBoutons();
            }
        }

        private void DesacitverTousBoutons()
        {
            // Modifier l'apparence des boutons pour qu'ils paraissent désactivés
            bouton1Precedent.BackColor = Color.DarkGray;
            bouton10000Precedent.BackColor = Color.DarkGray;
            boutonPrecedentToute.BackColor = Color.DarkGray;
            bouton1Suivant.BackColor = Color.DarkGray;
            bouton10000Suivant.BackColor = Color.DarkGray;
            boutonSuivantToute.BackColor = Color.DarkGray;
            boutonAjoutEnregistrement.BackColor = Color.DarkGray;
            boutonValidationChangementsTable.BackColor = Color.DarkGray;

            // Mettre à jour l'état
            boutonsDesactives = true;
        }

        private void ActiverTousBoutons()
        {
            // Restaurer l'apparence des boutons
            bouton1Precedent.BackColor = SystemColors.Window;
            bouton10000Precedent.BackColor = SystemColors.Window;
            boutonPrecedentToute.BackColor = SystemColors.Window;
            bouton1Suivant.BackColor = SystemColors.Window;
            bouton10000Suivant.BackColor = SystemColors.Window;
            boutonSuivantToute.BackColor = SystemColors.Window;
            boutonAjoutEnregistrement.BackColor = SystemColors.Window;
            boutonValidationChangementsTable.BackColor = SystemColors.Window;

            // Mettre à jour l'état
            boutonsDesactives = false;
        }

        private void AffichageDonnees()
        {
            using (var contexte = new AppDbContext())
            {
                var table = boiteListeAffichageTables.SelectedItem.ToString();
                switch (table)
                {
                    case "Departements":
                        grilleDonneesTables.Columns.Clear();

                        indexMax = contexte.Departements.Count();

                        CorrectionIndexesEtGestionPopup();

                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (indexMax >= 10000)
                        {
                            var departements = contexte.Departements.OrderBy(e => e.department_id).Skip(indexMinCourant).Take(nombreAffichages).ToList();
                            grilleDonneesTables.DataSource = departements;
                        }
                        else
                        {
                            var departements = contexte.Departements.OrderBy(e => e.department_id).ToList();
                            grilleDonneesTables.DataSource = departements;
                        }
                        break;
                    case "Employes":
                        grilleDonneesTables.Columns.Clear();

                        indexMax = contexte.Employes.Count();

                        CorrectionIndexesEtGestionPopup();

                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (indexMax >= 10000)
                        {
                            // Ensuite, on affiche les employés de l'indice minimal courant, à l'indice maximal courant
                            var employes = contexte.Employes.Include(e => e.departement).OrderBy(e => e.employee_id).Skip(indexMinCourant).Take(nombreAffichages).ToList();
                            grilleDonneesTables.DataSource = employes;
                        }
                        else
                        {
                            var employes = contexte.Employes.Include(e => e.departement).OrderBy(e => e.employee_id).ToList();
                            grilleDonneesTables.DataSource = employes;
                        }
                        break;
                    case "EmployesProjets":
                        grilleDonneesTables.Columns.Clear();

                        indexMax = contexte.EmployeProjets.Count();

                        CorrectionIndexesEtGestionPopup();
                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (indexMax >= 10000)
                        {
                            var employeProjets = contexte.EmployeProjets.OrderBy(e => e.employee_id).Skip(indexMinCourant).Take(nombreAffichages).ToList();
                            grilleDonneesTables.DataSource = employeProjets;
                        }
                        else
                        {
                            var employesProjets = contexte.EmployeProjets.OrderBy(e => e.employee_id).ToList();
                            grilleDonneesTables.DataSource = employesProjets;
                        }
                        break;
                    case "Projets":
                        grilleDonneesTables.Columns.Clear();

                        indexMax = contexte.Projets.Count();

                        CorrectionIndexesEtGestionPopup();

                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (indexMax >= 10000)
                        {
                            var projets = contexte.EmployeProjets.OrderBy(e => e.employee_id).Skip(indexMinCourant).Take(nombreAffichages).ToList();
                            grilleDonneesTables.DataSource = projets;
                        }
                        else
                        {
                            var projets = contexte.EmployeProjets.OrderBy(e => e.employee_id).ToList();
                            grilleDonneesTables.DataSource = projets;
                        }
                        break;
                    /*                    case "JointuresEmployes":
                                            var employesJointures = contexte.JointuresEmployes.Include(e => e.departement).OrderBy(e => e.employee_id).ToList();

                                            indexMax = employesJointures.Count;

                                            CorrectionIndexesEtGestionPopup();

                                            // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                                            if (employesJointures.Count >= 10000)
                                            {
                                                // Ensuite, on affiche les employés de l'indice minimal courant, à l'indice maximal courant
                                                var employeesJointures10000 = employesJointures.GetRange(indexMinCourant, nombreAffichages).ToList();
                                                grilleDonneesTables.DataSource = employeesJointures10000;
                                            }
                                            else
                                            {
                                                grilleDonneesTables.DataSource = employesJointures;
                                            }
                                            break;*/
                    default:
                        break;
                }

                if (popupDebut)
                    MessageBox.Show("Vous êtes arrivé au début de la liste");

                if (popupFin)
                    MessageBox.Show("Vous êtes arrivé à la fin de la liste");
            }
        }

        private void CorrectionIndexesEtGestionPopup()
        {
            if (indexMinCourant >= indexMax || indexMinCourant + nombreAffichages >= indexMax)
            {
                indexMinCourant = indexMax - nombreAffichages;
                // On fait apparaître un popup après l'affichage des données pour signifier qu'on est à la fin
                popupDebut = false;
                popupFin = true;
            }
            else if (indexMinCourant < indexMin)
            {
                indexMinCourant = 0;
                // On fait apparaître un popup après l'affichage des données pour signifier qu'on est au début
                popupDebut = true;
                popupFin = false;
            }
            else
            {
                // On ne fera apparaître aucun popup
                popupDebut = false;
                popupFin = false;
            }
        }

        private void boutonPrecedentToute_MouseEnter(object sender, EventArgs e)
        {
            if (boutonsDesactives)
                Cursor = Cursors.No;
            else
                Cursor = Cursors.Hand;
        }

        private void bouton10000Precedent_MouseEnter(object sender, EventArgs e)
        {
            if (boutonsDesactives)
                Cursor = Cursors.No;
            else
                Cursor = Cursors.Hand;
        }

        private void bouton1Precedent_MouseEnter(object sender, EventArgs e)
        {
            if (boutonsDesactives)
                Cursor = Cursors.No;
            else
                Cursor = Cursors.Hand;
        }

        private void bouton1Suivant_MouseEnter(object sender, EventArgs e)
        {
            if (boutonsDesactives)
                Cursor = Cursors.No;
            else
                Cursor = Cursors.Hand;
        }

        private void bouton10000Suivant_MouseEnter(object sender, EventArgs e)
        {
            if (boutonsDesactives)
                Cursor = Cursors.No;
            else
                Cursor = Cursors.Hand;
        }

        private void boutonSuivantToute_MouseEnter(object sender, EventArgs e)
        {
            if (boutonsDesactives)
                Cursor = Cursors.No;
            else
                Cursor = Cursors.Hand;
        }
        private void boutonValidationChangementsTable_MouseEnter(object sender, EventArgs e)
        {
            if (boutonsDesactives)
                Cursor = Cursors.No;
            else
                Cursor = Cursors.Hand;
        }

        private void boutonAjoutEnregistrement_MouseEnter(object sender, EventArgs e)
        {
            if (boutonsDesactives)
                Cursor = Cursors.No;
            else
                Cursor = Cursors.Hand;
        }

        private void boutonPrecedentToute_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void bouton10000Precedent_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void bouton1Precedent_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void bouton1Suivant_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void bouton10000Suivant_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void boutonSuivantToute_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;

        }

        private void boutonValidationChangementsTable_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void boutonAjoutEnregistrement_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }
        private void bouton1Precedent_Click(object sender, EventArgs e)
        {
            if (boutonsDesactives)
            {
                MessageBox.Show("Veuillez sélectionner une table pour activer les boutons.", "Bouton désactivé", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            indexMinCourant -= 1;
            nombreAffichages = 10000;

            AffichageDonnees();
        }

        private void bouton10000Precedent_Click(object sender, EventArgs e)
        {
            if (boutonsDesactives)
            {
                MessageBox.Show("Veuillez sélectionner une table pour activer les boutons.", "Bouton désactivé", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            indexMinCourant -= 10000;
            nombreAffichages = 10000;

            AffichageDonnees();
        }
        private void bouton10000PrecedentToute_Click(object sender, EventArgs e)
        {
            if (boutonsDesactives)
            {
                MessageBox.Show("Veuillez sélectionner une table pour activer les boutons.", "Bouton désactivé", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                return;
            }

            indexMinCourant = 0;
            nombreAffichages = 10000;

            AffichageDonnees();
        }

        private void bouton1Suivant_Click(object sender, EventArgs e)
        {
            if (boutonsDesactives)
            {
                MessageBox.Show("Veuillez sélectionner une table pour activer les boutons.", "Bouton désactivé", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            indexMinCourant += 1;
            nombreAffichages = 10000;

            AffichageDonnees();
        }

        private void bouton10000Suivant_Click(object sender, EventArgs e)
        {
            if (boutonsDesactives)
            {
                MessageBox.Show("Veuillez sélectionner une table pour activer les boutons.", "Bouton désactivé", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            indexMinCourant += 10000;
            nombreAffichages = 10000;

            AffichageDonnees();
        }

        private void bouton10000SuivantToute_Click(object sender, EventArgs e)
        {
            if (boutonsDesactives)
            {
                MessageBox.Show("Veuillez sélectionner une table pour activer les boutons.", "Bouton désactivé", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            indexMinCourant = int.MaxValue;
            nombreAffichages = 10000;

            AffichageDonnees();
        }

        /// <summary>
        /// Fonction permettant de se connecter à la base de données afin de charger la liste des tables
        /// </summary>
        private void boutonConnexionBDD_Click(object sender, EventArgs e)
        {
            using (var contexte = new AppDbContext())
            {
                // On charge la liste des tables
                // Les tables seront nommées : Departements, Employes, EmployeProjets, Projets
                List<string> tables = ["Departements", "Employes", "EmployesProjets", "Projets", "JointuresEmployes"];
                boiteListeAffichageTables.Items.Clear();
                foreach (var table in tables)
                {
                    boiteListeAffichageTables.Items.Add(table);
                }
            }
        }

        private void boiteListeAffichageTables_SelectedIndexChanged(object sender, EventArgs e)
        {
            nombreAffichages = 10000;
            ActiverTousBoutons();

            // On affiche la table sélectionnée
            using (var contexte = new AppDbContext())
            {
                var table = boiteListeAffichageTables.SelectedItem.ToString();
                switch (table)
                {
                    case "Departements":
                        grilleDonneesTables.Columns.Clear();

                        indexMax = contexte.Departements.Count();

                        CorrectionIndexesEtGestionPopup();

                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (indexMax >= 10000)
                        {
                            var departements = contexte.Departements.OrderBy(e => e.department_id).Skip(indexMinCourant).Take(nombreAffichages).ToList();
                            grilleDonneesTables.DataSource = departements;
                        }
                        else
                        {
                            indexMinCourant = 0;
                            var departements = contexte.Departements.OrderBy(e => e.department_id).ToList();
                            grilleDonneesTables.DataSource = departements;
                        }
                        break;
                    case "Employes":
                        grilleDonneesTables.Columns.Clear();

                        indexMax = contexte.Employes.Count();

                        CorrectionIndexesEtGestionPopup();

                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (indexMax >= 10000)
                        {
                            // Ensuite, on affiche les employés de l'indice minimal courant, à l'indice maximal courant
                            var employes = contexte.Employes.Include(e => e.departement).OrderBy(e => e.employee_id).Skip(indexMinCourant).Take(nombreAffichages).ToList();
                            grilleDonneesTables.DataSource = employes;
                        }
                        else
                        {
                            indexMinCourant = 0;
                            var employes = contexte.Employes.Include(e => e.departement).OrderBy(e => e.employee_id).ToList();
                            grilleDonneesTables.DataSource = employes;
                        }
                        break;
                    case "EmployesProjets":
                        grilleDonneesTables.Columns.Clear();

                        indexMax = contexte.EmployeProjets.Count();

                        CorrectionIndexesEtGestionPopup();
                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (indexMax >= 10000)
                        {
                            var employeProjets = contexte.EmployeProjets.OrderBy(e => e.employee_id).Skip(indexMinCourant).Take(nombreAffichages).ToList();
                            grilleDonneesTables.DataSource = employeProjets;
                        }
                        else
                        {
                            var employesProjets = contexte.EmployeProjets.OrderBy(e => e.employee_id).ToList();
                            grilleDonneesTables.DataSource = employesProjets;
                        }
                        break;
                    case "Projets":
                        grilleDonneesTables.Columns.Clear();

                        indexMax = contexte.Projets.Count();

                        CorrectionIndexesEtGestionPopup();

                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (indexMax >= 10000)
                        {
                            var projets = contexte.EmployeProjets.OrderBy(e => e.employee_id).Skip(indexMinCourant).Take(nombreAffichages).ToList();
                            grilleDonneesTables.DataSource = projets;
                        }
                        else
                        {
                            var projets = contexte.EmployeProjets.OrderBy(e => e.employee_id).ToList();
                            grilleDonneesTables.DataSource = projets;
                        }
                        break;
/*                    case "JointuresEmployes":
                        grilleDonneesTables.Columns.Clear();
                        var employesJointures = contexte.JointuresEmployes.Include(e => e.departement).OrderBy(e => e.employee_id).ToList();
                       
                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (employesJointures.Count >= 10000)
                        {
                            indexMinCourant = 0;
                            // Ensuite, on affiche les employés de l'indice minimal courant, à l'indice maximal courant
                            var employeesJointures10000 = employesJointures.GetRange(indexMinCourant, nombreAffichages);
                            grilleDonneesTables.DataSource = employeesJointures10000;
                        }
                        else
                        {
                            grilleDonneesTables.DataSource = employesJointures;
                        }
                        break;*/
                    default:
                        break;
                }
            }
        }

        private void BoutonValidationChangementsTable_Click(object sender, EventArgs e)
        {

        }

        private void BoutonAjoutEnregistrement_Click(object sender, EventArgs e)
        {
            if (boiteListeAffichageTables.SelectedItem == null)
            {
                MessageBox.Show("Veuillez sélectionner une table avant d'ajouter un enregistrement.", "Aucune table sélectionnée", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            string tableName = boiteListeAffichageTables.SelectedItem.ToString();
            using (var formAjout = new FormAjouterEnregistrement(tableName))
            {
                if (formAjout.ShowDialog() == DialogResult.OK)
                {
                    // Rafraîchir les données après l'ajout
                    AffichageDonnees();
                }
            }
        }
    }
}

J'en ai un second comme suit : 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace TP_Evaluation_Forms_IMBAUD_Florian
{
    public partial class FormAjouterEnregistrement : Form
    {
        private string tableName;
        private Dictionary<string, Control> inputControls = new Dictionary<string, Control>();

        public FormAjouterEnregistrement(string tableName)
        {
            InitializeComponent();
            this.tableName = tableName;
            this.Text = $"Ajouter un enregistrement dans {tableName}";
            GenerateFormFields();
        }

        private void GenerateFormFields()
        {
            using (var contexte = new AppDbContext())
            {
                switch (tableName)
                {
                    case "Departements":
                        AddField(panneauChampsARemplir, "department_name", new TextBox(), "Nom Département");
                        break;

                    case "Employes":
                        AddField(panneauChampsARemplir, "first_name", new TextBox(), "Prénom");
                        AddField(panneauChampsARemplir, "last_name", new TextBox(), "Nom");
                        AddField(panneauChampsARemplir, "hire_date", new DateTimePicker(), "Date d'Embauche");
                        AddField(panneauChampsARemplir, "department_id", new TextBox(), "ID Département");
                        AddField(panneauChampsARemplir, "salary", new TextBox(), "Salaire");
                        break;

                    case "EmployesProjets":
                        AddField(panneauChampsARemplir, "employee_id", new TextBox(), "ID Employé");
                        AddField(panneauChampsARemplir, "project_id", new TextBox(), "ID Projet");
                        AddField(panneauChampsARemplir, "role", new TextBox(), "Rôle");
                        break;

                    case "Projets":
                        AddField(panneauChampsARemplir, "project_name", new TextBox(), "Nom Projet");
                        AddField(panneauChampsARemplir, "start_date", new DateTimePicker(), "Date de Début");
                        AddField(panneauChampsARemplir, "end_date", new DateTimePicker(), "Date de Fin");
                        break;

                    default:
                        MessageBox.Show("Table non reconnue.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        this.Close();
                        break;
                }
            }

            // Ajouter le panel au formulaire
            Controls.Add(panneauChampsARemplir);
        }

        private void AddField(TableLayoutPanel panel, string propertyName, Control control, string labelText)
        {
            int row = panel.RowCount++;
            panel.RowStyles.Add(new RowStyle(SizeType.AutoSize));

            Label label = new Label
            {
                Text = labelText,
                Anchor = AnchorStyles.Right,
                AutoSize = true
            };
            panel.Controls.Add(label, 0, row);

            control.Anchor = AnchorStyles.Left | AnchorStyles.Right;
            panel.Controls.Add(control, 1, row);

            inputControls.Add(propertyName, control);
        }

        private void BtnEnregistrer_Click(object sender, EventArgs e)
        {
            try
            {
                using (var contexte = new AppDbContext())
                {
                    switch (tableName)
                    {
                        case "Departements":
                            var nouveauDept = new CDepartement
                            {
                                department_name = GetControlValue("department_name")
                            };
                            contexte.Departements.Add(nouveauDept);
                            break;

                        case "Employes":
                            var nouvelEmploye = new CEmploye
                            {
                                first_name = GetControlValue("first_name"),
                                last_name = GetControlValue("last_name"),
                                hire_date = ((DateTimePicker)inputControls["hire_date"]).Value,
                                department_id = string.IsNullOrWhiteSpace(GetControlValue("department_id")) ? (int?)null : int.Parse(GetControlValue("department_id")),
                                salary = decimal.Parse(GetControlValue("salary"))
                            };

                            // Validation supplémentaire (exemple)
                            if (nouvelEmploye.salary < 0)
                            {
                                MessageBox.Show("Le salaire ne peut pas être négatif.", "Erreur de Validation", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                return;
                            }

                            contexte.Employes.Add(nouvelEmploye);
                            break;

                        case "EmployesProjets":
                            var nouvelEmployeProjet = new CEmployeProjet
                            {
                                employee_id = int.Parse(GetControlValue("employee_id")),
                                project_id = int.Parse(GetControlValue("project_id")),
                                role = GetControlValue("role")
                            };
                            contexte.EmployeProjets.Add(nouvelEmployeProjet);
                            break;

                        case "Projets":
                            var nouveauProjet = new CProjet
                            {
                                project_name = GetControlValue("project_name"),
                                start_date = ((DateTimePicker)inputControls["start_date"]).Value,
                                end_date = ((DateTimePicker)inputControls["end_date"]).Value
                            };

                            // Validation des dates
                            if (nouveauProjet.end_date < nouveauProjet.start_date)
                            {
                                MessageBox.Show("La date de fin ne peut pas être antérieure à la date de début.", "Erreur de Validation", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                return;
                            }

                            contexte.Projets.Add(nouveauProjet);
                            break;

                        default:
                            MessageBox.Show("Table non reconnue.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                    }

                    contexte.SaveChanges();
                }

                MessageBox.Show("Enregistrement ajouté avec succès.", "Succès", MessageBoxButtons.OK, MessageBoxIcon.Information);
                DialogResult = DialogResult.OK;
                Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Erreur lors de l'ajout de l'enregistrement : {ex.Message} {ex.InnerException.Message}", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private string GetControlValue(string propertyName)
        {
            if (inputControls.TryGetValue(propertyName, out Control control))
            {
                if (control is TextBox txt)
                    return txt.Text.Trim();
            }
            return string.Empty;
        }

        private void btnAnnuler_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}

Je voudrais changer le fonctionnement, afin de ne pas enregistrer directement dans le contexte quand les données sont modifiées, mais simplement de les ajouter au visionnage actuel des données sur la table, et de demander à l'utilisateur si il veut les enregistrer quand il quitte la base de données actuellement sélectionnée si il y a eu un ajout, ou simplement que ça enregistre les ajouts à l'appui du bouton du formulaire principal