using Microsoft.EntityFrameworkCore;

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 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;

            // 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;

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

        private void AffichageDonnees()
        {
            using (var contexte = new AppDbContext())
            {
                var table = boiteListeAffichageTables.SelectedItem.ToString();
                switch (table)
                {
                    case "departments":
                        var departements = contexte.Departements.OrderBy(d => d.department_id).ToList();
                        indexMax = 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 departements10000 = departements.GetRange(indexMinCourant, nombreAffichages).ToList();
                            grilleDonneesTables.DataSource = departements10000;
                        }
                        else
                        {
                            grilleDonneesTables.DataSource = departements;
                        }
                        break;
                    case "employees":
                        var employes = contexte.Employes.OrderBy(e => e.employee_id).ToList();
                        indexMax = employes.Count;

                        CorrectionIndexesEtGestionPopup();

                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (employes.Count >= 10000)
                        {
                            // Ensuite, on affiche les employés de l'indice minimal courant, à l'indice maximal courant
                            var employees10000 = employes.GetRange(indexMinCourant, nombreAffichages).ToList();
                            grilleDonneesTables.DataSource = employees10000;
                        }
                        else
                        {
                            grilleDonneesTables.DataSource = employes;
                        }
                        break;
                    case "employee_projects":
                        var employeProjets = contexte.EmployeProjets.OrderBy(ep => ep.employee_id).ToList();
                        indexMax = employeProjets.Count;

                        CorrectionIndexesEtGestionPopup();

                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (employeProjets.Count >= 10000)
                        {
                            var employeProjets10000 = employeProjets.GetRange(indexMinCourant, nombreAffichages);
                            grilleDonneesTables.DataSource = employeProjets10000;
                        }
                        else
                        {
                            grilleDonneesTables.DataSource = employeProjets;
                        }
                        break;
                    case "projects":
                        var projets = contexte.Projets.OrderBy(p => p.project_id).ToList();
                        indexMax = 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 projets10000 = projets.GetRange(indexMinCourant, nombreAffichages);
                            grilleDonneesTables.DataSource = projets10000;
                        }
                        else
                        {
                            grilleDonneesTables.DataSource = projets;
                        }
                        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 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 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.Information);
                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
                var tables = contexte.Model.GetEntityTypes().Select(t => t.GetTableName()).ToList();
                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 "departments":
                        grilleDonneesTables.Columns.Clear();
                        var departements = contexte.Departements.OrderBy(d => d.department_id).ToList();
                        indexMax = departements.Count - 1;
                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (indexMax >= 10000)
                        {
                            indexMinCourant = 0;

                            var departements10000 = departements.GetRange(indexMinCourant, nombreAffichages);
                            grilleDonneesTables.DataSource = departements10000;
                        }
                        else
                        {
                            grilleDonneesTables.DataSource = departements;
                        }
                        break;
                    case "employees":
                        grilleDonneesTables.Columns.Clear();
                        var employes = contexte.Employes.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 (employes.Count >= 10000)
                        {
                            indexMinCourant = 0;
                            // Ensuite, on affiche les employés de l'indice minimal courant, à l'indice maximal courant
                            var employes10000 = employes.GetRange(indexMinCourant, nombreAffichages);
                            grilleDonneesTables.DataSource = employes10000;
                        }
                        else
                        {
                            grilleDonneesTables.DataSource = employes;
                        }
                        break;
                    case "employee_projects":
                        grilleDonneesTables.Columns.Clear();
                        var employeProjets = contexte.EmployeProjets.OrderBy(ep => ep.employee_id).ToList();
                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (employeProjets.Count >= 10000)
                        {
                            indexMinCourant = 0;
                            var employeProjets10000 = employeProjets.GetRange(indexMinCourant, nombreAffichages);
                            grilleDonneesTables.DataSource = employeProjets10000;
                        }
                        else
                        {
                            grilleDonneesTables.DataSource = employeProjets;
                        }
                        break;
                    case "projects":
                        grilleDonneesTables.Columns.Clear();
                        var projets = contexte.Projets.OrderBy(p => p.project_id).ToList();
                        indexMax = projets.Count - 1;
                        // Si il y a plus de 10000 données, on les affiche par page de 10000 dans grilleDonneesTable
                        if (indexMax >= 10000)
                        {
                            indexMinCourant = 0;
                            var projets10000 = projets.GetRange(indexMinCourant, nombreAffichages);
                            grilleDonneesTables.DataSource = projets10000;
                        }
                        else
                        {
                            grilleDonneesTables.DataSource = projets;
                        }
                        break;
                    default:
                        break;
                }
            }
        }

        private void BoutonAjoutEnregistrementTableCourante_Click(object sender, EventArgs e)
        {

        }

        private void BoutonValidationModificationTableCOurante_Click(object sender, EventArgs e)
        {

        }
    }
}

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TP_Evaluation_Forms_IMBAUD_Florian
{
    public class AppDbContext : DbContext
    {
        public DbSet<CEmploye> Employes { get; set; }
        public DbSet<CDepartement> Departements { get; set; }
        public DbSet<CProjet> Projets { get; set; }
        public DbSet<CEmployeProjet> EmployeProjets { get; set; }

        public static string chaineConnexion = "Host=" + "127.0.0.1" + ";" +
                                               "Port=" + "5432" + ";" +
                                               "Database=" + "postgres" + ";" +
                                               "Username=" + "postgres" + ";" +
                                               "Password=" + "admin";

        public AppDbContext() : base(OptionsConnexionPostgreSQL)
        {

        }

        protected static DbContextOptions OptionsConnexionPostgreSQL
        {
            get
            {
                return new DbContextOptionsBuilder()
                    .UseNpgsql(chaineConnexion)
                    .Options;
            }
        }
    }
}
Il faudrait que tu implémentes un système d'ajout et de confirmations des modifications effectuées dans la liste, au sein des fonctions prévues à cet effet