Erweiterte Fahrzeugliste und moderne Oberfläche

This commit is contained in:
younes elhaddoury 2025-08-31 18:10:01 +02:00
parent 3ef417ee70
commit 943c9df593
7 changed files with 63 additions and 37 deletions

View File

@ -31,3 +31,7 @@ Dieses Projekt dient als einfache Verwaltung von Fahrzeugen für ein Autohaus. D
## Autoren ## Autoren
Dieses Projekt wurde im Rahmen einer Übung von **Younes**, **Saad** und **Ayman** erstellt. Dieses Projekt wurde im Rahmen einer Übung von **Younes**, **Saad** und **Ayman** erstellt.
- **Younes** kümmerte sich um Datenbank und grundlegende Geschäftslogik.
- **Saad** gestaltete die Oberfläche und implementierte den PDF-Export.
- **Ayman** verfasste die Dokumentation und begleitete die Tests.

View File

@ -6,7 +6,7 @@ namespace FahrzeugVerwaltung
public partial class App : Application public partial class App : Application
{ {
// Startet das Programm und registriert Fehlerbehandlung // Startet Programm und meldet Fehler
protected override void OnStartup(StartupEventArgs e) protected override void OnStartup(StartupEventArgs e)
{ {
base.OnStartup(e); base.OnStartup(e);
@ -14,7 +14,7 @@ namespace FahrzeugVerwaltung
DispatcherUnhandledException += App_UnbehandelteAusnahme; DispatcherUnhandledException += App_UnbehandelteAusnahme;
} }
// Zeigt Fehler der Oberfläche an // Zeigt Fehler in Oberfläche
private void App_UnbehandelteAusnahme(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) private void App_UnbehandelteAusnahme(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{ {
MessageBox.Show($"Ein unerwarteter Fehler ist aufgetreten:\n{e.Exception.Message}", MessageBox.Show($"Ein unerwarteter Fehler ist aufgetreten:\n{e.Exception.Message}",
@ -22,7 +22,7 @@ namespace FahrzeugVerwaltung
e.Handled = true; e.Handled = true;
} }
// Meldet schwere Ausnahmen des Programms // Meldet kritische Ausnahmen
private void Domain_UnbehandelteAusnahme(object sender, UnhandledExceptionEventArgs e) private void Domain_UnbehandelteAusnahme(object sender, UnhandledExceptionEventArgs e)
{ {
MessageBox.Show($"Ein kritischer Fehler ist aufgetreten:\n{((Exception)e.ExceptionObject).Message}", MessageBox.Show($"Ein kritischer Fehler ist aufgetreten:\n{((Exception)e.ExceptionObject).Message}",

View File

@ -17,7 +17,7 @@ namespace FahrzeugVerwaltung
ErstelleDatenbank(); ErstelleDatenbank();
} }
// Legt Datenbank und Tabelle an // Erstellt Datenbank und Tabelle
private void ErstelleDatenbank() private void ErstelleDatenbank()
{ {
using var connection = new SQLiteConnection(_connectionString); using var connection = new SQLiteConnection(_connectionString);
@ -38,7 +38,7 @@ namespace FahrzeugVerwaltung
command.ExecuteNonQuery(); command.ExecuteNonQuery();
} }
// Speichert ein Fahrzeug und liefert die neue Id // Speichert Fahrzeug und gibt neue Id zurück
public int SpeichereFahrzeug(Fahrzeug fahrzeug) public int SpeichereFahrzeug(Fahrzeug fahrzeug)
{ {
using var connection = new SQLiteConnection(_connectionString); using var connection = new SQLiteConnection(_connectionString);
@ -58,7 +58,7 @@ namespace FahrzeugVerwaltung
return Convert.ToInt32(command.ExecuteScalar()); return Convert.ToInt32(command.ExecuteScalar());
} }
// Lädt alle gespeicherten Fahrzeuge // Lädt alle Fahrzeuge
public List<Fahrzeug> LadeAlleFahrzeuge() public List<Fahrzeug> LadeAlleFahrzeuge()
{ {
var fahrzeuge = new List<Fahrzeug>(); var fahrzeuge = new List<Fahrzeug>();
@ -84,7 +84,7 @@ namespace FahrzeugVerwaltung
return fahrzeuge; return fahrzeuge;
} }
// Sucht Fahrzeuge anhand eines Textes // Sucht Fahrzeuge mit Text
public List<Fahrzeug> SucheFahrzeuge(string suchbegriff) public List<Fahrzeug> SucheFahrzeuge(string suchbegriff)
{ {
if (string.IsNullOrWhiteSpace(suchbegriff)) if (string.IsNullOrWhiteSpace(suchbegriff))
@ -120,7 +120,7 @@ namespace FahrzeugVerwaltung
return fahrzeuge; return fahrzeuge;
} }
// Aktualisiert ein vorhandenes Fahrzeug // Aktualisiert Fahrzeug
public bool AktualisiereFahrzeug(Fahrzeug fahrzeug) public bool AktualisiereFahrzeug(Fahrzeug fahrzeug)
{ {
using var connection = new SQLiteConnection(_connectionString); using var connection = new SQLiteConnection(_connectionString);
@ -147,7 +147,7 @@ namespace FahrzeugVerwaltung
return command.ExecuteNonQuery() > 0; return command.ExecuteNonQuery() > 0;
} }
// Entfernt ein Fahrzeug aus der Datenbank // Löscht Fahrzeug
public bool LoescheFahrzeug(int id) public bool LoescheFahrzeug(int id)
{ {
using var connection = new SQLiteConnection(_connectionString); using var connection = new SQLiteConnection(_connectionString);
@ -158,7 +158,7 @@ namespace FahrzeugVerwaltung
return command.ExecuteNonQuery() > 0; return command.ExecuteNonQuery() > 0;
} }
// Gibt die Anzahl der gespeicherten Fahrzeuge zurück // Zählt Fahrzeuge
public int HoleAnzahlFahrzeuge() public int HoleAnzahlFahrzeuge()
{ {
using var connection = new SQLiteConnection(_connectionString); using var connection = new SQLiteConnection(_connectionString);

View File

@ -27,10 +27,10 @@ namespace FahrzeugVerwaltung
public string KaufpreisFormatiert => $"{Kaufpreis:C}"; public string KaufpreisFormatiert => $"{Kaufpreis:C}";
public string AktuellerWertFormatiert => $"{AktuellerWert:C}"; public string AktuellerWertFormatiert => $"{AktuellerWert:C}";
// Gibt den geschätzten aktuellen Wert zurück // Geschätzter aktueller Wert
public decimal AktuellerWert => BerechneAktuellenWert(); public decimal AktuellerWert => BerechneAktuellenWert();
// Berechnet den Wert anhand von Alter und Laufleistung // Berechnet aktuellen Wert
public decimal BerechneAktuellenWert() public decimal BerechneAktuellenWert()
{ {
if (Kaufpreis <= 0 || Baujahr <= 0) return 0; if (Kaufpreis <= 0 || Baujahr <= 0) return 0;
@ -51,19 +51,19 @@ namespace FahrzeugVerwaltung
return Math.Round(wert, 2); return Math.Round(wert, 2);
} }
// Liefert eine kurze Fahrzeugbeschreibung // Beschreibung für Anzeige
public string HoleBeschreibung() public string HoleBeschreibung()
{ {
return $"{Marke} {Modell} ({Baujahr}) - {Leistung} PS - {KilometerstandFormatiert} - {Farbe}"; return $"{Marke} {Modell} ({Baujahr}) - {Leistung} PS - {KilometerstandFormatiert} - {Farbe}";
} }
// Berechnet das Alter des Fahrzeugs // Alter des Fahrzeugs
public int HoleAlter() public int HoleAlter()
{ {
return DateTime.Now.Year - Baujahr; return DateTime.Now.Year - Baujahr;
} }
// Prüft, ob das Fahrzeug als Oldtimer gilt // Prüft auf Oldtimer
public bool IstOldtimer() public bool IstOldtimer()
{ {
return HoleAlter() >= 30; return HoleAlter() >= 30;
@ -71,7 +71,7 @@ namespace FahrzeugVerwaltung
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
// Informiert die Oberfläche über eine geänderte Eigenschaft // Meldet geänderte Eigenschaft
private void MeldeEigenschaft(string eigenschaft) private void MeldeEigenschaft(string eigenschaft)
{ {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(eigenschaft)); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(eigenschaft));

View File

@ -39,13 +39,25 @@
<Setter Property="Height" Value="25"/> <Setter Property="Height" Value="25"/>
</Style> </Style>
<Style TargetType="Label">
<Setter Property="Foreground" Value="#FF333333"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Margin" Value="0,2,0,2"/>
</Style>
<Style TargetType="GroupBox"> <Style TargetType="GroupBox">
<Setter Property="FontWeight" Value="Bold"/> <Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="#FF333333"/> <Setter Property="Foreground" Value="#FF333333"/>
</Style> </Style>
</Window.Resources> </Window.Resources>
<Grid Margin="10" Background="#F5F5F5"> <Grid Margin="10">
<Grid.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FFFFFF" Offset="0"/>
<GradientStop Color="#E3F2FD" Offset="1"/>
</LinearGradientBrush>
</Grid.Background>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="400"/> <ColumnDefinition Width="400"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
@ -55,7 +67,7 @@
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Grid.ColumnSpan="2" Grid.Row="0" Text="Fahrzeugverwaltung" FontSize="26" FontWeight="Bold" Foreground="#FF1976D2" HorizontalAlignment="Center" Margin="0,0,0,10"/> <TextBlock Grid.ColumnSpan="2" Grid.Row="0" Text="Fahrzeugverwaltung" FontSize="32" FontWeight="SemiBold" FontFamily="Segoe UI" Foreground="#FF1976D2" HorizontalAlignment="Center" Margin="0,0,0,10"/>
<GroupBox Grid.Column="0" Grid.Row="1" Header="Neues Fahrzeug" Margin="5"> <GroupBox Grid.Column="0" Grid.Row="1" Header="Neues Fahrzeug" Margin="5">
<Grid Margin="10"> <Grid Margin="10">
<Grid.RowDefinitions> <Grid.RowDefinitions>

View File

@ -22,7 +22,7 @@ namespace FahrzeugVerwaltung
MarkenVorbereiten(); MarkenVorbereiten();
FahrzeugeLaden(); FahrzeugeLaden();
} }
// Erstellt Hilfsdienste // Legt Dienste an
private void DiensteAnlegen() private void DiensteAnlegen()
{ {
_datenbankDienst = new DatabaseService(); _datenbankDienst = new DatabaseService();
@ -30,7 +30,7 @@ namespace FahrzeugVerwaltung
_fahrzeuge = new List<Fahrzeug>(); _fahrzeuge = new List<Fahrzeug>();
} }
// Legt Marken und Modelle fest // Bereitet Marken und Modelle vor
private void MarkenVorbereiten() private void MarkenVorbereiten()
{ {
_markenModelle = new Dictionary<string, List<string>> _markenModelle = new Dictionary<string, List<string>>
@ -54,13 +54,23 @@ namespace FahrzeugVerwaltung
{"Fiat", new List<string>{"500","Panda","Tipo","Punto","Doblo","Bravo"}}, {"Fiat", new List<string>{"500","Panda","Tipo","Punto","Doblo","Bravo"}},
{"Volvo", new List<string>{"S60","S90","V60","V90","XC60","XC90"}}, {"Volvo", new List<string>{"S60","S90","V60","V90","XC60","XC90"}},
{"Subaru", new List<string>{"Impreza","Legacy","Outback","Forester","XV","BRZ"}}, {"Subaru", new List<string>{"Impreza","Legacy","Outback","Forester","XV","BRZ"}},
{"Tesla", new List<string>{"Model S","Model 3","Model X","Model Y","Roadster","Cybertruck"}} {"Tesla", new List<string>{"Model S","Model 3","Model X","Model Y","Roadster","Cybertruck"}},
{"Chevrolet", new List<string>{"Spark","Cruze","Malibu","Equinox","Traverse","Tahoe"}},
{"Jaguar", new List<string>{"XE","XF","XJ","F-Pace","E-Pace","I-Pace"}},
{"Jeep", new List<string>{"Renegade","Compass","Cherokee","Grand Cherokee","Wrangler","Gladiator"}},
{"Land Rover", new List<string>{"Discovery Sport","Discovery","Range Rover Evoque","Range Rover Sport","Defender","Velar"}},
{"Lexus", new List<string>{"IS","ES","GS","RX","NX","LC"}},
{"Mitsubishi", new List<string>{"Space Star","Lancer","Outlander","ASX","Eclipse Cross","Pajero"}},
{"Porsche", new List<string>{"911","Cayenne","Panamera","Macan","Taycan","Boxster"}},
{"Citroën", new List<string>{"C1","C3","C4","C5","C3 Aircross","Berlingo"}},
{"Alfa Romeo", new List<string>{"Giulia","Giulietta","Stelvio","MiTo","4C","Tonale"}},
{"Mini", new List<string>{"One","Cooper","Clubman","Countryman","Cabrio","Paceman"}}
}; };
cmbMarke.ItemsSource = _markenModelle.Keys; cmbMarke.ItemsSource = _markenModelle.Keys;
} }
// Lädt alle Fahrzeuge aus der Datenbank // Lädt Fahrzeuge aus der Datenbank
private void FahrzeugeLaden() private void FahrzeugeLaden()
{ {
_fahrzeuge = _datenbankDienst.LadeAlleFahrzeuge(); _fahrzeuge = _datenbankDienst.LadeAlleFahrzeuge();
@ -68,7 +78,7 @@ namespace FahrzeugVerwaltung
StatusAktualisieren(); StatusAktualisieren();
} }
// Zeigt die aktuelle Anzahl der Fahrzeuge an // Zeigt Anzahl der Fahrzeuge
private void StatusAktualisieren() private void StatusAktualisieren()
{ {
if (_fahrzeuge.Count == 0) if (_fahrzeuge.Count == 0)
@ -77,7 +87,7 @@ namespace FahrzeugVerwaltung
txtDetails.Text = $"{_fahrzeuge.Count} Fahrzeug(e) gefunden"; txtDetails.Text = $"{_fahrzeuge.Count} Fahrzeug(e) gefunden";
} }
// Fügt ein neues Fahrzeug hinzu // Fügt Fahrzeug hinzu
private void BtnHinzufuegen_Click(object sender, RoutedEventArgs e) private void BtnHinzufuegen_Click(object sender, RoutedEventArgs e)
{ {
if (!EingabenPruefen()) if (!EingabenPruefen())
@ -100,7 +110,7 @@ namespace FahrzeugVerwaltung
FahrzeugeLaden(); FahrzeugeLaden();
} }
// Aktualisiert das ausgewählte Fahrzeug // Speichert Änderungen
private void BtnBearbeiten_Click(object sender, RoutedEventArgs e) private void BtnBearbeiten_Click(object sender, RoutedEventArgs e)
{ {
if (_ausgewaehltesFahrzeug == null || !EingabenPruefen()) if (_ausgewaehltesFahrzeug == null || !EingabenPruefen())
@ -119,7 +129,7 @@ namespace FahrzeugVerwaltung
FahrzeugeLaden(); FahrzeugeLaden();
} }
// Entfernt das gewählte Fahrzeug // Löscht ausgewähltes Fahrzeug
private void BtnLoeschen_Click(object sender, RoutedEventArgs e) private void BtnLoeschen_Click(object sender, RoutedEventArgs e)
{ {
if (_ausgewaehltesFahrzeug == null) if (_ausgewaehltesFahrzeug == null)
@ -136,7 +146,7 @@ namespace FahrzeugVerwaltung
} }
} }
// Prüft die Eingaben // Prüft Eingaben
private bool EingabenPruefen() private bool EingabenPruefen()
{ {
var fehler = new List<string>(); var fehler = new List<string>();
@ -165,7 +175,7 @@ namespace FahrzeugVerwaltung
return true; return true;
} }
// Setzt alle Eingaben zurück // Leert Eingaben
private void EingabenLeeren() private void EingabenLeeren()
{ {
cmbMarke.SelectedIndex = -1; cmbMarke.SelectedIndex = -1;
@ -178,7 +188,7 @@ namespace FahrzeugVerwaltung
cmbMarke.Focus(); cmbMarke.Focus();
} }
// Sucht Fahrzeuge per Text // Sucht Fahrzeuge
private void BtnSuchen_Click(object sender, RoutedEventArgs e) private void BtnSuchen_Click(object sender, RoutedEventArgs e)
{ {
var suchbegriff = txtSuche.Text.Trim(); var suchbegriff = txtSuche.Text.Trim();
@ -190,14 +200,14 @@ namespace FahrzeugVerwaltung
StatusAktualisieren(); StatusAktualisieren();
} }
// Zeigt wieder alle Fahrzeuge // Zeigt alle Fahrzeuge
private void BtnAlle_Click(object sender, RoutedEventArgs e) private void BtnAlle_Click(object sender, RoutedEventArgs e)
{ {
txtSuche.Clear(); txtSuche.Clear();
FahrzeugeLaden(); FahrzeugeLaden();
} }
// Reagiert auf Auswahl in der Tabelle // Reagiert auf Tabellen-Auswahl
private void Liste_AuswahlGeaendert(object sender, SelectionChangedEventArgs e) private void Liste_AuswahlGeaendert(object sender, SelectionChangedEventArgs e)
{ {
_ausgewaehltesFahrzeug = dgFahrzeuge.SelectedItem as Fahrzeug; _ausgewaehltesFahrzeug = dgFahrzeuge.SelectedItem as Fahrzeug;
@ -222,7 +232,7 @@ namespace FahrzeugVerwaltung
} }
} }
// Speichert das Fahrzeug als PDF // Exportiert Fahrzeug als PDF
private void BtnPdf_Click(object sender, RoutedEventArgs e) private void BtnPdf_Click(object sender, RoutedEventArgs e)
{ {
if (_ausgewaehltesFahrzeug == null) if (_ausgewaehltesFahrzeug == null)
@ -241,13 +251,13 @@ namespace FahrzeugVerwaltung
} }
} }
// Lädt die Liste neu // Aktualisiert Liste
private void BtnAktualisieren_Click(object sender, RoutedEventArgs e) private void BtnAktualisieren_Click(object sender, RoutedEventArgs e)
{ {
FahrzeugeLaden(); FahrzeugeLaden();
} }
// Unterstützt einfache Tastenkürzel // Tastenkürzel
protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e) protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e)
{ {
if (e.Key == System.Windows.Input.Key.S && System.Windows.Input.Keyboard.Modifiers == System.Windows.Input.ModifierKeys.Control) if (e.Key == System.Windows.Input.Key.S && System.Windows.Input.Keyboard.Modifiers == System.Windows.Input.ModifierKeys.Control)
@ -274,7 +284,7 @@ namespace FahrzeugVerwaltung
base.OnKeyDown(e); base.OnKeyDown(e);
} }
// Aktualisiert die Modelle zur Marke // Passt Modelle zur Marke an
private void CmbMarke_AuswahlGeaendert(object sender, SelectionChangedEventArgs e) private void CmbMarke_AuswahlGeaendert(object sender, SelectionChangedEventArgs e)
{ {
if (cmbMarke.SelectedItem == null) if (cmbMarke.SelectedItem == null)

View File

@ -7,7 +7,7 @@ namespace FahrzeugVerwaltung
{ {
public class PdfService public class PdfService
{ {
// Erstellt ein PDF mit den Daten eines Fahrzeugs // Erstellt PDF für ein Fahrzeug
public bool ErstelleFahrzeugPdf(Fahrzeug fahrzeug, string dateiPfad) public bool ErstelleFahrzeugPdf(Fahrzeug fahrzeug, string dateiPfad)
{ {
try try
@ -31,7 +31,7 @@ namespace FahrzeugVerwaltung
} }
} }
// Erstellt ein PDF mit allen Fahrzeugen // Erstellt PDF mit allen Fahrzeugen
public bool ErstelleFahrzeuglistePdf(List<Fahrzeug> fahrzeuge, string dateiPfad) public bool ErstelleFahrzeuglistePdf(List<Fahrzeug> fahrzeuge, string dateiPfad)
{ {
try try