0% ont trouvé ce document utile (0 vote)
1 vues4 pages

Explication Form1

Le document présente le code source de la classe Form1 d'une application Windows Forms, avec des commentaires détaillés ligne par ligne. Il décrit les fonctionnalités principales telles que le chargement d'icônes, la gestion de la connexion utilisateur, et les bonnes pratiques de sécurité et de performance. Des recommandations sont également fournies pour améliorer la sécurité des mots de passe et éviter les injections SQL.

Transféré par

2k25tvhome
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
1 vues4 pages

Explication Form1

Le document présente le code source de la classe Form1 d'une application Windows Forms, avec des commentaires détaillés ligne par ligne. Il décrit les fonctionnalités principales telles que le chargement d'icônes, la gestion de la connexion utilisateur, et les bonnes pratiques de sécurité et de performance. Des recommandations sont également fournies pour améliorer la sécurité des mots de passe et éviter les injections SQL.

Transféré par

2k25tvhome
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi