Explication détaillée de Form1.
cs - Code commenté
ligne par ligne
Code source avec commentaires explicatifs
using System; // Importe les types fondamentaux
de .NET (Object, String, Exception, etc.)
using [Link]; // Importe les collections génériques
(List<T>, Dictionary, etc.)
using [Link]; // Fournit des attributs pour les
composants et la liaison de données
using [Link]; // Classes pour l'accès et la
manipulation de données
using [Link]; // Classes graphiques (Icon, Bitmap,
Color, etc.)
using [Link]; // Classes pour les opérations sur
fichiers et dossiers
using [Link]; // Requêtes LINQ pour la manipulation de
collections
using [Link]; // Classes pour le formatage des chaînes
(StringBuilder, etc.)
using [Link]; // Support pour la programmation
asynchrone (Task, Task<T>)
using [Link]; // Classes pour les applications Windows
Forms
using [Link]; // Entity Framework pour l'ORM et
l'accès aux données
namespace AppGestionRecrutement // Espace de noms contenant tout le code
de l'application
{
public partial class Form1 : Form // Classe publique héritant de Form
(formulaire Windows)
{
public Form1() // Constructeur de la classe
{
InitializeComponent(); // Méthode auto-générée qui
initialise les contrôles du formulaire
LoadIcons(); // Appel à la méthode pour charger les
icônes depuis le dossier Icons
}
private void LoadIcons() // Méthode privée pour charger les
icônes
{
try // Bloc try pour gérer les erreurs d'E/S
{
var iconPath = [Link]([Link],
"Icons"); // Chemin vers le dossier Icons
if ([Link](iconPath)) // Vérifie si le dossier existe
{
var lockIconPath = [Link](iconPath,
"lock_icon_130885.ico"); // Chemin icône cadenas
var userIconPath = [Link](iconPath,
"communitysupport_users_people_6236.ico"); // Chemin icône utilisateur
if ([Link](lockIconPath)) // Vérifie si l'icône du
cadenas existe
{
[Link] = new
Icon(lockIconPath).ToBitmap(); // Charge et convertit l'icône en Bitmap
}
if ([Link](userIconPath)) // Vérifie si l'icône
utilisateur existe
{
[Link] = new
Icon(userIconPath).ToBitmap(); // Charge et convertit l'icône en Bitmap
}
}
}
catch (Exception) // Capture les exceptions (fichiers
manquants, format incorrect)
{
// Icônes non disponibles, on continue sans elles - approche
tolérante
}
}
private void button1_Click(object sender, EventArgs e) // Gestionnaire
du bouton Quitter
{
[Link](); // Ferme l'application et arrête le
message loop
}
private async void btnSeConnecter_Click(object sender, EventArgs e) //
Gestionnaire asynchrone du bouton Connexion
{
var identifiant = [Link]?.Trim(); // Récupère
l'identifiant avec Trim() pour enlever les espaces
var motDePasse = [Link]; // Récupère le mot de
passe saisi
if ([Link](identifiant) ||
[Link](motDePasse)) // Validation des champs vides
{
[Link](); // Met le formulaire au premier plan
[Link]("Veuillez saisir l'identifiant et le mot de
passe.", "Attention", [Link], [Link]); // Affiche
une alerte
return; // Sort de la méthode
}
[Link] = false; // Désactive le bouton pour
éviter les doubles-clics
try // Bloc try pour gérer les erreurs
de base de données
{
using (var ctx = new [Link]()) // Crée le
contexte EF avec libération automatique
{
var user = await [Link] // Requête asynchrone sur
la table utilisateurs
.AsNoTracking() // Optimisation : pas de
suivi des changements
.FirstOrDefaultAsync(u => [Link] == identifiant
&& [Link] == motDePasse); // Trouve l'utilisateur ou retourne null
if (user != null) // Si l'utilisateur est trouvé
(authentification réussie)
{
[Link]($"Connexion réussie. Bienvenue
{[Link]} !", "Succès", [Link],
[Link]); // Message de bienvenue
var form2 = new Form2(); // Crée la fenêtre principale
[Link] += (s, args) => [Link](); //
S'abonne à la fermeture pour quitter l'appli
[Link](); // Affiche Form2
[Link](); // Ferme le formulaire de
connexion
}
else // Si l'utilisateur n'est pas
trouvé
{
[Link](); // Met le formulaire au
premier plan
[Link]("Identifiant ou mot de passe
incorrect.", "Erreur", [Link], [Link]); // Message
d'erreur
}
}
}
catch (Exception ex) // Capture les exceptions
(problème DB, etc.)
{
[Link](); // Met le formulaire au premier
plan
[Link]("Erreur lors de la connexion à la base de
données : " + [Link], "Erreur", [Link], [Link]);
// Affiche l'erreur
}
finally // Bloc finally toujours exécuté
{
[Link] = true; // Réactive le bouton (même en
cas d'erreur)
}
}
private void label1_Click(object sender, EventArgs e) // Gestionnaire
vide pour le clic sur un label
{
private void txtMotDePasse_TextChanged(object sender, EventArgs e) //
Gestionnaire vide pour le changement de texte du mot de passe
{
private void txtIdentifiant_TextChanged(object sender, EventArgs e) //
Gestionnaire vide pour le changement de texte de l'identifiant
{
}
}
}
Points techniques importants
Sécurité
⚠️Attention : Ce code stocke et compare les mots de passe en clair. Dans une application réelle, il
faudrait :
• Hacher les mots de passe avec un algorithme comme bcrypt ou PBKDF2
• Utiliser des requêtes paramétrées pour éviter les injections SQL
• Implémenter un système de session/token
Performance
• AsNoTracking() améliore les performances pour les lectures seulement
• L'approche async évite le blocage de l'interface pendant la requête DB
Bonnes pratiques
• Utilisation du pattern using pour la gestion des ressources
• Validation des entrées côté client
• Gestion des erreurs avec try/catch/finally
• Désactivation du bouton pendant l'opération pour éviter les doubles clics