From 7b2c38cc4e67257704343eda94176fbc9a745fe7 Mon Sep 17 00:00:00 2001 From: younes elhaddoury <167001847+elhy17@users.noreply.github.com> Date: Sun, 31 Aug 2025 17:32:38 +0200 Subject: [PATCH] Deutsche Kommentare und moderne Fahrzeugverwaltung --- README.md | 7 +- WpfApp4/App.xaml.cs | 16 ++--- WpfApp4/DatabaseService.cs | 20 +++--- WpfApp4/Fahrzeug.cs | 50 ++++++++------ WpfApp4/MainWindow.xaml | 28 ++++++-- WpfApp4/MainWindow.xaml.cs | 130 ++++++++++++++++++++----------------- WpfApp4/PdfService.cs | 4 +- 7 files changed, 146 insertions(+), 109 deletions(-) diff --git a/README.md b/README.md index 1e1f9c2..155bd14 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,19 @@ Ein einfaches WPF-Projekt zur Verwaltung von Fahrzeugen. Daten werden in einer lokalen SQLite-Datenbank gespeichert. ## Funktionen -- Fahrzeuge anlegen, bearbeiten und löschen +- Fahrzeuge anlegen, bearbeiten und löschen (CRUD) +- Auswahl aus zwanzig Marken mit je sechs Modellen - Suche und Übersicht mit DataGrid - Export eines Fahrzeugs als PDF - Berechnung eines ungefähren Fahrzeugwerts +- Modernes Erscheinungsbild mit Kopfzeile und Buttons ## Bedienung 1. Marke und Modell wählen, restliche Felder ausfüllen. 2. **Hinzufügen** speichert ein neues Fahrzeug. 3. Ein Fahrzeug in der Liste auswählen und mit **Bearbeiten** ändern oder mit **Löschen** entfernen. -4. **Als PDF speichern** erzeugt ein Informationsblatt. +4. **Aktualisieren** lädt die Liste neu, **Alle anzeigen** zeigt wieder alle Fahrzeuge. +5. **Als PDF speichern** erzeugt ein Informationsblatt. ## Entwicklung Dieses Projekt wurde im Rahmen einer Übung von **Younes**, **Saad** und **Ayman** erstellt. diff --git a/WpfApp4/App.xaml.cs b/WpfApp4/App.xaml.cs index 81b3d11..0f0aa20 100644 --- a/WpfApp4/App.xaml.cs +++ b/WpfApp4/App.xaml.cs @@ -3,27 +3,27 @@ using System.Windows; namespace FahrzeugVerwaltung { - + public partial class App : Application { - // startet die Anwendung und richtet Fehlerbehandlung ein + // Startet das Programm und registriert Fehlerbehandlung protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - DispatcherUnhandledException += App_DispatcherUnhandledException; + AppDomain.CurrentDomain.UnhandledException += Domain_UnbehandelteAusnahme; + DispatcherUnhandledException += App_UnbehandelteAusnahme; } - // behandelt UI-Ausnahmen - private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) + // Zeigt Fehler der Oberfläche an + private void App_UnbehandelteAusnahme(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { MessageBox.Show($"Ein unerwarteter Fehler ist aufgetreten:\n{e.Exception.Message}", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); e.Handled = true; } - // behandelt kritische Ausnahmen - private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + // Meldet schwere Ausnahmen des Programms + private void Domain_UnbehandelteAusnahme(object sender, UnhandledExceptionEventArgs e) { MessageBox.Show($"Ein kritischer Fehler ist aufgetreten:\n{((Exception)e.ExceptionObject).Message}", "Kritischer Fehler", MessageBoxButton.OK, MessageBoxImage.Error); diff --git a/WpfApp4/DatabaseService.cs b/WpfApp4/DatabaseService.cs index 227b136..d4dcedc 100644 --- a/WpfApp4/DatabaseService.cs +++ b/WpfApp4/DatabaseService.cs @@ -14,11 +14,11 @@ namespace FahrzeugVerwaltung { _dbPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "fahrzeuge.db"); _connectionString = $"Data Source={_dbPath};Version=3;"; - InitializeDatabase(); + ErstelleDatenbank(); } - // erstellt die Datenbank und Tabelle - private void InitializeDatabase() + // Legt Datenbank und Tabelle an + private void ErstelleDatenbank() { using var connection = new SQLiteConnection(_connectionString); connection.Open(); @@ -38,7 +38,7 @@ namespace FahrzeugVerwaltung command.ExecuteNonQuery(); } - // speichert ein Fahrzeug und gibt die neue Id zurück + // Speichert ein Fahrzeug und liefert die neue Id public int SpeichereFahrzeug(Fahrzeug fahrzeug) { using var connection = new SQLiteConnection(_connectionString); @@ -58,7 +58,7 @@ namespace FahrzeugVerwaltung return Convert.ToInt32(command.ExecuteScalar()); } - // lädt alle Fahrzeuge + // Lädt alle gespeicherten Fahrzeuge public List LadeAlleFahrzeuge() { var fahrzeuge = new List(); @@ -84,7 +84,7 @@ namespace FahrzeugVerwaltung return fahrzeuge; } - // sucht Fahrzeuge nach Begriff + // Sucht Fahrzeuge anhand eines Textes public List SucheFahrzeuge(string suchbegriff) { if (string.IsNullOrWhiteSpace(suchbegriff)) @@ -120,7 +120,7 @@ namespace FahrzeugVerwaltung return fahrzeuge; } - // aktualisiert ein Fahrzeug + // Aktualisiert ein vorhandenes Fahrzeug public bool AktualisiereFahrzeug(Fahrzeug fahrzeug) { using var connection = new SQLiteConnection(_connectionString); @@ -147,7 +147,7 @@ namespace FahrzeugVerwaltung return command.ExecuteNonQuery() > 0; } - // löscht ein Fahrzeug + // Entfernt ein Fahrzeug aus der Datenbank public bool LoescheFahrzeug(int id) { using var connection = new SQLiteConnection(_connectionString); @@ -158,8 +158,8 @@ namespace FahrzeugVerwaltung return command.ExecuteNonQuery() > 0; } - // gibt die Anzahl der Fahrzeuge zurück - public int GetAnzahlFahrzeuge() + // Gibt die Anzahl der gespeicherten Fahrzeuge zurück + public int HoleAnzahlFahrzeuge() { using var connection = new SQLiteConnection(_connectionString); connection.Open(); diff --git a/WpfApp4/Fahrzeug.cs b/WpfApp4/Fahrzeug.cs index e8db68a..6f6640d 100644 --- a/WpfApp4/Fahrzeug.cs +++ b/WpfApp4/Fahrzeug.cs @@ -14,23 +14,23 @@ namespace FahrzeugVerwaltung private decimal _kaufpreis; private string _farbe; - public int Id { get => _id; set { _id = value; OnPropertyChanged(nameof(Id)); } } - public string Marke { get => _marke; set { _marke = value; OnPropertyChanged(nameof(Marke)); } } - public string Modell { get => _modell; set { _modell = value; OnPropertyChanged(nameof(Modell)); } } - public int Baujahr { get => _baujahr; set { _baujahr = value; OnPropertyChanged(nameof(Baujahr)); OnPropertyChanged(nameof(AktuellerWert)); OnPropertyChanged(nameof(AktuellerWertFormatiert)); } } - public int Leistung { get => _leistung; set { _leistung = value; OnPropertyChanged(nameof(Leistung)); } } - public int Kilometerstand { get => _kilometerstand; set { _kilometerstand = value; OnPropertyChanged(nameof(Kilometerstand)); OnPropertyChanged(nameof(KilometerstandFormatiert)); OnPropertyChanged(nameof(AktuellerWert)); OnPropertyChanged(nameof(AktuellerWertFormatiert)); } } - public decimal Kaufpreis { get => _kaufpreis; set { _kaufpreis = value; OnPropertyChanged(nameof(Kaufpreis)); OnPropertyChanged(nameof(KaufpreisFormatiert)); OnPropertyChanged(nameof(AktuellerWert)); OnPropertyChanged(nameof(AktuellerWertFormatiert)); } } - public string Farbe { get => _farbe; set { _farbe = value; OnPropertyChanged(nameof(Farbe)); } } + public int Id { get => _id; set { _id = value; MeldeEigenschaft(nameof(Id)); } } + public string Marke { get => _marke; set { _marke = value; MeldeEigenschaft(nameof(Marke)); } } + public string Modell { get => _modell; set { _modell = value; MeldeEigenschaft(nameof(Modell)); } } + public int Baujahr { get => _baujahr; set { _baujahr = value; MeldeEigenschaft(nameof(Baujahr)); MeldeEigenschaft(nameof(AktuellerWert)); MeldeEigenschaft(nameof(AktuellerWertFormatiert)); } } + public int Leistung { get => _leistung; set { _leistung = value; MeldeEigenschaft(nameof(Leistung)); } } + public int Kilometerstand { get => _kilometerstand; set { _kilometerstand = value; MeldeEigenschaft(nameof(Kilometerstand)); MeldeEigenschaft(nameof(KilometerstandFormatiert)); MeldeEigenschaft(nameof(AktuellerWert)); MeldeEigenschaft(nameof(AktuellerWertFormatiert)); } } + public decimal Kaufpreis { get => _kaufpreis; set { _kaufpreis = value; MeldeEigenschaft(nameof(Kaufpreis)); MeldeEigenschaft(nameof(KaufpreisFormatiert)); MeldeEigenschaft(nameof(AktuellerWert)); MeldeEigenschaft(nameof(AktuellerWertFormatiert)); } } + public string Farbe { get => _farbe; set { _farbe = value; MeldeEigenschaft(nameof(Farbe)); } } public string KilometerstandFormatiert => $"{Kilometerstand:N0} km"; public string KaufpreisFormatiert => $"{Kaufpreis:C}"; public string AktuellerWertFormatiert => $"{AktuellerWert:C}"; - // berechnet den geschätzten aktuellen Wert + // Gibt den geschätzten aktuellen Wert zurück public decimal AktuellerWert => BerechneAktuellenWert(); - // ermittelt den aktuellen Wert basierend auf Alter und Laufleistung + // Berechnet den Wert anhand von Alter und Laufleistung public decimal BerechneAktuellenWert() { if (Kaufpreis <= 0 || Baujahr <= 0) return 0; @@ -51,19 +51,31 @@ namespace FahrzeugVerwaltung return Math.Round(wert, 2); } - // liefert eine kurze Beschreibung - public string GetDetailedDescription() => - $"{Marke} {Modell} ({Baujahr}) - {Leistung} PS - {KilometerstandFormatiert} - {Farbe}"; + // Liefert eine kurze Fahrzeugbeschreibung + public string HoleBeschreibung() + { + return $"{Marke} {Modell} ({Baujahr}) - {Leistung} PS - {KilometerstandFormatiert} - {Farbe}"; + } - // gibt das Alter des Fahrzeugs zurück - public int GetAlter() => DateTime.Now.Year - Baujahr; + // Berechnet das Alter des Fahrzeugs + public int HoleAlter() + { + return DateTime.Now.Year - Baujahr; + } - // prüft, ob das Fahrzeug ein Oldtimer ist - public bool IsOldtimer() => GetAlter() >= 30; + // Prüft, ob das Fahrzeug als Oldtimer gilt + public bool IstOldtimer() + { + return HoleAlter() >= 30; + } public event PropertyChangedEventHandler PropertyChanged; - private void OnPropertyChanged(string propertyName) => - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + + // Informiert die Oberfläche über eine geänderte Eigenschaft + private void MeldeEigenschaft(string eigenschaft) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(eigenschaft)); + } public override string ToString() => $"{Marke} {Modell} ({Baujahr})"; } diff --git a/WpfApp4/MainWindow.xaml b/WpfApp4/MainWindow.xaml index 8a76d0d..694bc0e 100644 --- a/WpfApp4/MainWindow.xaml +++ b/WpfApp4/MainWindow.xaml @@ -6,13 +6,25 @@