Deutsche Kommentare und moderne Fahrzeugverwaltung

This commit is contained in:
younes elhaddoury 2025-08-31 17:32:38 +02:00
parent b0bb865a87
commit 7b2c38cc4e
7 changed files with 146 additions and 109 deletions

View File

@ -3,16 +3,19 @@
Ein einfaches WPF-Projekt zur Verwaltung von Fahrzeugen. Daten werden in einer lokalen SQLite-Datenbank gespeichert. Ein einfaches WPF-Projekt zur Verwaltung von Fahrzeugen. Daten werden in einer lokalen SQLite-Datenbank gespeichert.
## Funktionen ## 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 - Suche und Übersicht mit DataGrid
- Export eines Fahrzeugs als PDF - Export eines Fahrzeugs als PDF
- Berechnung eines ungefähren Fahrzeugwerts - Berechnung eines ungefähren Fahrzeugwerts
- Modernes Erscheinungsbild mit Kopfzeile und Buttons
## Bedienung ## Bedienung
1. Marke und Modell wählen, restliche Felder ausfüllen. 1. Marke und Modell wählen, restliche Felder ausfüllen.
2. **Hinzufügen** speichert ein neues Fahrzeug. 2. **Hinzufügen** speichert ein neues Fahrzeug.
3. Ein Fahrzeug in der Liste auswählen und mit **Bearbeiten** ändern oder mit **Löschen** entfernen. 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 ## Entwicklung
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.

View File

@ -3,27 +3,27 @@ using System.Windows;
namespace FahrzeugVerwaltung namespace FahrzeugVerwaltung
{ {
public partial class App : Application public partial class App : Application
{ {
// startet die Anwendung und richtet Fehlerbehandlung ein // Startet das Programm und registriert Fehlerbehandlung
protected override void OnStartup(StartupEventArgs e) protected override void OnStartup(StartupEventArgs e)
{ {
base.OnStartup(e); base.OnStartup(e);
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AppDomain.CurrentDomain.UnhandledException += Domain_UnbehandelteAusnahme;
DispatcherUnhandledException += App_DispatcherUnhandledException; DispatcherUnhandledException += App_UnbehandelteAusnahme;
} }
// behandelt UI-Ausnahmen // Zeigt Fehler der Oberfläche an
private void App_DispatcherUnhandledException(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}",
"Fehler", MessageBoxButton.OK, MessageBoxImage.Error); "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
e.Handled = true; e.Handled = true;
} }
// behandelt kritische Ausnahmen // Meldet schwere Ausnahmen des Programms
private void CurrentDomain_UnhandledException(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}",
"Kritischer Fehler", MessageBoxButton.OK, MessageBoxImage.Error); "Kritischer Fehler", MessageBoxButton.OK, MessageBoxImage.Error);

View File

@ -14,11 +14,11 @@ namespace FahrzeugVerwaltung
{ {
_dbPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "fahrzeuge.db"); _dbPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "fahrzeuge.db");
_connectionString = $"Data Source={_dbPath};Version=3;"; _connectionString = $"Data Source={_dbPath};Version=3;";
InitializeDatabase(); ErstelleDatenbank();
} }
// erstellt die Datenbank und Tabelle // Legt Datenbank und Tabelle an
private void InitializeDatabase() private void ErstelleDatenbank()
{ {
using var connection = new SQLiteConnection(_connectionString); using var connection = new SQLiteConnection(_connectionString);
connection.Open(); connection.Open();
@ -38,7 +38,7 @@ namespace FahrzeugVerwaltung
command.ExecuteNonQuery(); 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) 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 Fahrzeuge // Lädt alle gespeicherten 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 nach Begriff // Sucht Fahrzeuge anhand eines Textes
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 Fahrzeug // Aktualisiert ein vorhandenes 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;
} }
// löscht ein Fahrzeug // Entfernt ein Fahrzeug aus der Datenbank
public bool LoescheFahrzeug(int id) public bool LoescheFahrzeug(int id)
{ {
using var connection = new SQLiteConnection(_connectionString); using var connection = new SQLiteConnection(_connectionString);
@ -158,8 +158,8 @@ namespace FahrzeugVerwaltung
return command.ExecuteNonQuery() > 0; return command.ExecuteNonQuery() > 0;
} }
// gibt die Anzahl der Fahrzeuge zurück // Gibt die Anzahl der gespeicherten Fahrzeuge zurück
public int GetAnzahlFahrzeuge() public int HoleAnzahlFahrzeuge()
{ {
using var connection = new SQLiteConnection(_connectionString); using var connection = new SQLiteConnection(_connectionString);
connection.Open(); connection.Open();

View File

@ -14,23 +14,23 @@ namespace FahrzeugVerwaltung
private decimal _kaufpreis; private decimal _kaufpreis;
private string _farbe; private string _farbe;
public int Id { get => _id; set { _id = value; OnPropertyChanged(nameof(Id)); } } public int Id { get => _id; set { _id = value; MeldeEigenschaft(nameof(Id)); } }
public string Marke { get => _marke; set { _marke = value; OnPropertyChanged(nameof(Marke)); } } public string Marke { get => _marke; set { _marke = value; MeldeEigenschaft(nameof(Marke)); } }
public string Modell { get => _modell; set { _modell = value; OnPropertyChanged(nameof(Modell)); } } public string Modell { get => _modell; set { _modell = value; MeldeEigenschaft(nameof(Modell)); } }
public int Baujahr { get => _baujahr; set { _baujahr = value; OnPropertyChanged(nameof(Baujahr)); OnPropertyChanged(nameof(AktuellerWert)); OnPropertyChanged(nameof(AktuellerWertFormatiert)); } } 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; OnPropertyChanged(nameof(Leistung)); } } public int Leistung { get => _leistung; set { _leistung = value; MeldeEigenschaft(nameof(Leistung)); } }
public int Kilometerstand { get => _kilometerstand; set { _kilometerstand = value; OnPropertyChanged(nameof(Kilometerstand)); OnPropertyChanged(nameof(KilometerstandFormatiert)); OnPropertyChanged(nameof(AktuellerWert)); OnPropertyChanged(nameof(AktuellerWertFormatiert)); } } 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; OnPropertyChanged(nameof(Kaufpreis)); OnPropertyChanged(nameof(KaufpreisFormatiert)); OnPropertyChanged(nameof(AktuellerWert)); OnPropertyChanged(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; OnPropertyChanged(nameof(Farbe)); } } public string Farbe { get => _farbe; set { _farbe = value; MeldeEigenschaft(nameof(Farbe)); } }
public string KilometerstandFormatiert => $"{Kilometerstand:N0} km"; public string KilometerstandFormatiert => $"{Kilometerstand:N0} km";
public string KaufpreisFormatiert => $"{Kaufpreis:C}"; public string KaufpreisFormatiert => $"{Kaufpreis:C}";
public string AktuellerWertFormatiert => $"{AktuellerWert:C}"; public string AktuellerWertFormatiert => $"{AktuellerWert:C}";
// berechnet den geschätzten aktuellen Wert // Gibt den geschätzten aktuellen Wert zurück
public decimal AktuellerWert => BerechneAktuellenWert(); public decimal AktuellerWert => BerechneAktuellenWert();
// ermittelt den aktuellen Wert basierend auf Alter und Laufleistung // Berechnet den Wert anhand von Alter und Laufleistung
public decimal BerechneAktuellenWert() public decimal BerechneAktuellenWert()
{ {
if (Kaufpreis <= 0 || Baujahr <= 0) return 0; if (Kaufpreis <= 0 || Baujahr <= 0) return 0;
@ -51,19 +51,31 @@ namespace FahrzeugVerwaltung
return Math.Round(wert, 2); return Math.Round(wert, 2);
} }
// liefert eine kurze Beschreibung // Liefert eine kurze Fahrzeugbeschreibung
public string GetDetailedDescription() => public string HoleBeschreibung()
$"{Marke} {Modell} ({Baujahr}) - {Leistung} PS - {KilometerstandFormatiert} - {Farbe}"; {
return $"{Marke} {Modell} ({Baujahr}) - {Leistung} PS - {KilometerstandFormatiert} - {Farbe}";
}
// gibt das Alter des Fahrzeugs zurück // Berechnet das Alter des Fahrzeugs
public int GetAlter() => DateTime.Now.Year - Baujahr; public int HoleAlter()
{
return DateTime.Now.Year - Baujahr;
}
// prüft, ob das Fahrzeug ein Oldtimer ist // Prüft, ob das Fahrzeug als Oldtimer gilt
public bool IsOldtimer() => GetAlter() >= 30; public bool IstOldtimer()
{
return HoleAlter() >= 30;
}
public event PropertyChangedEventHandler PropertyChanged; 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})"; public override string ToString() => $"{Marke} {Modell} ({Baujahr})";
} }

View File

@ -6,13 +6,25 @@
<Window.Resources> <Window.Resources>
<Style TargetType="Button"> <Style TargetType="Button">
<Setter Property="Background" Value="#FF2196F3"/>
<Setter Property="Foreground" Value="White"/> <Setter Property="Foreground" Value="White"/>
<Setter Property="FontWeight" Value="Bold"/> <Setter Property="FontWeight" Value="Bold"/>
<Setter Property="BorderBrush" Value="#FF1976D2"/> <Setter Property="BorderBrush" Value="#FF1976D2"/>
<Setter Property="BorderThickness" Value="1"/> <Setter Property="BorderThickness" Value="1"/>
<Setter Property="Background" Value="#FF2196F3"/>
<Setter Property="Padding" Value="10,5"/> <Setter Property="Padding" Value="10,5"/>
<Setter Property="Margin" Value="5"/> <Setter Property="Margin" Value="5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="5">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers> <Style.Triggers>
<Trigger Property="IsMouseOver" Value="True"> <Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FF1976D2"/> <Setter Property="Background" Value="#FF1976D2"/>
@ -39,10 +51,12 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<GroupBox Grid.Column="0" Grid.Row="0" Header="Neues Fahrzeug" Margin="5"> <TextBlock Grid.ColumnSpan="2" Grid.Row="0" Text="Fahrzeugverwaltung" FontSize="26" FontWeight="Bold" Foreground="#FF1976D2" HorizontalAlignment="Center" Margin="0,0,0,10"/>
<GroupBox Grid.Column="0" Grid.Row="1" Header="Neues Fahrzeug" Margin="5">
<Grid Margin="10"> <Grid Margin="10">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
@ -59,7 +73,7 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Content="Marke:" VerticalAlignment="Center"/> <Label Grid.Row="0" Grid.Column="0" Content="Marke:" VerticalAlignment="Center"/>
<ComboBox Grid.Row="0" Grid.Column="1" Name="cmbMarke" Margin="5" SelectionChanged="CmbMarke_SelectionChanged"/> <ComboBox Grid.Row="0" Grid.Column="1" Name="cmbMarke" Margin="5" SelectionChanged="CmbMarke_AuswahlGeaendert"/>
<Label Grid.Row="1" Grid.Column="0" Content="Modell:" VerticalAlignment="Center"/> <Label Grid.Row="1" Grid.Column="0" Content="Modell:" VerticalAlignment="Center"/>
<ComboBox Grid.Row="1" Grid.Column="1" Name="cmbModell" Margin="5"/> <ComboBox Grid.Row="1" Grid.Column="1" Name="cmbModell" Margin="5"/>
@ -80,7 +94,7 @@
<TextBox Grid.Row="6" Grid.Column="1" Name="txtFarbe" Margin="5"/> <TextBox Grid.Row="6" Grid.Column="1" Name="txtFarbe" Margin="5"/>
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox Grid.Column="1" Grid.Row="0" Header="Fahrzeuge suchen" Margin="5"> <GroupBox Grid.Column="1" Grid.Row="1" Header="Fahrzeuge suchen" Margin="5">
<StackPanel Margin="10" Orientation="Horizontal"> <StackPanel Margin="10" Orientation="Horizontal">
<Label Content="Suchbegriff:" VerticalAlignment="Center"/> <Label Content="Suchbegriff:" VerticalAlignment="Center"/>
<TextBox Name="txtSuche" Width="200" Margin="5"/> <TextBox Name="txtSuche" Width="200" Margin="5"/>
@ -90,7 +104,7 @@
Click="BtnAlle_Click"/> Click="BtnAlle_Click"/>
</StackPanel> </StackPanel>
</GroupBox> </GroupBox>
<GroupBox Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" Header="Fahrzeuge" Margin="5"> <GroupBox Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Header="Fahrzeuge" Margin="5">
<Grid Margin="10"> <Grid Margin="10">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
@ -98,9 +112,9 @@
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<DataGrid Grid.Row="0" Name="dgFahrzeuge" AutoGenerateColumns="False" <DataGrid Grid.Row="0" Name="dgFahrzeuge" AutoGenerateColumns="False"
IsReadOnly="True" SelectionMode="Single" Margin="10,10,0,28" IsReadOnly="True" SelectionMode="Single" Margin="10,10,0,28"
SelectionChanged="DgFahrzeuge_SelectionChanged" Grid.RowSpan="2"> AlternatingRowBackground="#FFE3F2FD" SelectionChanged="Liste_AuswahlGeaendert" Grid.RowSpan="2">
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="Marke" Binding="{Binding Marke}" Width="100"/> <DataGridTextColumn Header="Marke" Binding="{Binding Marke}" Width="100"/>
<DataGridTextColumn Header="Modell" Binding="{Binding Modell}" Width="120"/> <DataGridTextColumn Header="Modell" Binding="{Binding Modell}" Width="120"/>

View File

@ -9,30 +9,29 @@ namespace FahrzeugVerwaltung
{ {
public partial class MainWindow : Window public partial class MainWindow : Window
{ {
private DatabaseService _databaseService; private DatabaseService _datenbankDienst;
private PdfService _pdfService; private PdfService _pdfDienst;
private List<Fahrzeug> _aktuelleFahrzeuge; private List<Fahrzeug> _fahrzeuge;
private Fahrzeug _ausgewaehltesFahrzeug; private Fahrzeug _ausgewaehltesFahrzeug;
private Dictionary<string, List<string>> _markenModelle; private Dictionary<string, List<string>> _markenModelle;
public MainWindow() public MainWindow()
{ {
InitializeComponent(); InitializeComponent();
InitializeServices(); DiensteAnlegen();
InitializeMarken(); MarkenVorbereiten();
LadeFahrzeuge(); FahrzeugeLaden();
} }
// Erstellt Hilfsdienste
// legt die Dienste an private void DiensteAnlegen()
private void InitializeServices()
{ {
_databaseService = new DatabaseService(); _datenbankDienst = new DatabaseService();
_pdfService = new PdfService(); _pdfDienst = new PdfService();
_aktuelleFahrzeuge = new List<Fahrzeug>(); _fahrzeuge = new List<Fahrzeug>();
} }
// füllt die Listen für Marken und Modelle // Legt Marken und Modelle fest
private void InitializeMarken() private void MarkenVorbereiten()
{ {
_markenModelle = new Dictionary<string, List<string>> _markenModelle = new Dictionary<string, List<string>>
{ {
@ -45,33 +44,43 @@ namespace FahrzeugVerwaltung
{"Toyota", new List<string>{"Yaris","Corolla","Camry","RAV4","C-HR","Auris"}}, {"Toyota", new List<string>{"Yaris","Corolla","Camry","RAV4","C-HR","Auris"}},
{"Honda", new List<string>{"Civic","Accord","Jazz","CR-V","HR-V","NSX"}}, {"Honda", new List<string>{"Civic","Accord","Jazz","CR-V","HR-V","NSX"}},
{"Hyundai", new List<string>{"i20","i30","i40","Tucson","Santa Fe","Kona"}}, {"Hyundai", new List<string>{"i20","i30","i40","Tucson","Santa Fe","Kona"}},
{"Nissan", new List<string>{"Micra","Juke","Qashqai","X-Trail","Leaf","Navara"}} {"Nissan", new List<string>{"Micra","Juke","Qashqai","X-Trail","Leaf","Navara"}},
{"Kia", new List<string>{"Rio","Ceed","Sportage","Sorento","Picanto","Stonic"}},
{"Mazda", new List<string>{"Mazda2","Mazda3","Mazda6","CX-3","CX-5","MX-5"}},
{"Peugeot", new List<string>{"208","308","508","2008","3008","5008"}},
{"Renault", new List<string>{"Clio","Megane","Talisman","Captur","Kadjar","Scenic"}},
{"Skoda", new List<string>{"Fabia","Octavia","Superb","Kodiaq","Karoq","Scala"}},
{"Seat", new List<string>{"Ibiza","Leon","Ateca","Arona","Tarraco","Toledo"}},
{"Fiat", new List<string>{"500","Panda","Tipo","Punto","Doblo","Bravo"}},
{"Volvo", new List<string>{"S60","S90","V60","V90","XC60","XC90"}},
{"Subaru", new List<string>{"Impreza","Legacy","Outback","Forester","XV","BRZ"}},
{"Tesla", new List<string>{"Model S","Model 3","Model X","Model Y","Roadster","Cybertruck"}}
}; };
cmbMarke.ItemsSource = _markenModelle.Keys; cmbMarke.ItemsSource = _markenModelle.Keys;
} }
// lädt alle Fahrzeuge // Lädt alle Fahrzeuge aus der Datenbank
private void LadeFahrzeuge() private void FahrzeugeLaden()
{ {
_aktuelleFahrzeuge = _databaseService.LadeAlleFahrzeuge(); _fahrzeuge = _datenbankDienst.LadeAlleFahrzeuge();
dgFahrzeuge.ItemsSource = _aktuelleFahrzeuge; dgFahrzeuge.ItemsSource = _fahrzeuge;
UpdateStatusText(); StatusAktualisieren();
} }
// zeigt Anzahl der Fahrzeuge an // Zeigt die aktuelle Anzahl der Fahrzeuge an
private void UpdateStatusText() private void StatusAktualisieren()
{ {
if (_aktuelleFahrzeuge.Count == 0) if (_fahrzeuge.Count == 0)
txtDetails.Text = "Keine Fahrzeuge vorhanden"; txtDetails.Text = "Keine Fahrzeuge vorhanden";
else else
txtDetails.Text = $"{_aktuelleFahrzeuge.Count} Fahrzeug(e) gefunden"; txtDetails.Text = $"{_fahrzeuge.Count} Fahrzeug(e) gefunden";
} }
// fügt ein neues Fahrzeug hinzu // Fügt ein neues Fahrzeug hinzu
private void BtnHinzufuegen_Click(object sender, RoutedEventArgs e) private void BtnHinzufuegen_Click(object sender, RoutedEventArgs e)
{ {
if (!PruefeEingaben()) if (!EingabenPruefen())
return; return;
var fahrzeug = new Fahrzeug var fahrzeug = new Fahrzeug
@ -85,16 +94,16 @@ namespace FahrzeugVerwaltung
Farbe = txtFarbe.Text.Trim() Farbe = txtFarbe.Text.Trim()
}; };
fahrzeug.Id = _databaseService.SpeichereFahrzeug(fahrzeug); fahrzeug.Id = _datenbankDienst.SpeichereFahrzeug(fahrzeug);
MessageBox.Show("Fahrzeug gespeichert.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information); MessageBox.Show("Fahrzeug gespeichert.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
ClearInputFields(); EingabenLeeren();
LadeFahrzeuge(); FahrzeugeLaden();
} }
// bearbeitet das ausgewählte Fahrzeug // Aktualisiert das ausgewählte Fahrzeug
private void BtnBearbeiten_Click(object sender, RoutedEventArgs e) private void BtnBearbeiten_Click(object sender, RoutedEventArgs e)
{ {
if (_ausgewaehltesFahrzeug == null || !PruefeEingaben()) if (_ausgewaehltesFahrzeug == null || !EingabenPruefen())
return; return;
_ausgewaehltesFahrzeug.Marke = cmbMarke.SelectedItem.ToString(); _ausgewaehltesFahrzeug.Marke = cmbMarke.SelectedItem.ToString();
@ -105,13 +114,12 @@ namespace FahrzeugVerwaltung
_ausgewaehltesFahrzeug.Kaufpreis = decimal.Parse(txtKaufpreis.Text.Trim()); _ausgewaehltesFahrzeug.Kaufpreis = decimal.Parse(txtKaufpreis.Text.Trim());
_ausgewaehltesFahrzeug.Farbe = txtFarbe.Text.Trim(); _ausgewaehltesFahrzeug.Farbe = txtFarbe.Text.Trim();
if (_databaseService.AktualisiereFahrzeug(_ausgewaehltesFahrzeug)) if (_datenbankDienst.AktualisiereFahrzeug(_ausgewaehltesFahrzeug))
MessageBox.Show("Fahrzeug aktualisiert.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information); MessageBox.Show("Fahrzeug aktualisiert.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
FahrzeugeLaden();
LadeFahrzeuge();
} }
// löscht das ausgewählte Fahrzeug // Entfernt das gewählte Fahrzeug
private void BtnLoeschen_Click(object sender, RoutedEventArgs e) private void BtnLoeschen_Click(object sender, RoutedEventArgs e)
{ {
if (_ausgewaehltesFahrzeug == null) if (_ausgewaehltesFahrzeug == null)
@ -119,17 +127,17 @@ namespace FahrzeugVerwaltung
if (MessageBox.Show("Fahrzeug wirklich löschen?", "Bestätigung", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) if (MessageBox.Show("Fahrzeug wirklich löschen?", "Bestätigung", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{ {
if (_databaseService.LoescheFahrzeug(_ausgewaehltesFahrzeug.Id)) if (_datenbankDienst.LoescheFahrzeug(_ausgewaehltesFahrzeug.Id))
{ {
MessageBox.Show("Fahrzeug gelöscht.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information); MessageBox.Show("Fahrzeug gelöscht.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
ClearInputFields(); EingabenLeeren();
LadeFahrzeuge(); FahrzeugeLaden();
} }
} }
} }
// prüft die Eingaben // Prüft die Eingaben
private bool PruefeEingaben() private bool EingabenPruefen()
{ {
var fehler = new List<string>(); var fehler = new List<string>();
@ -157,8 +165,8 @@ namespace FahrzeugVerwaltung
return true; return true;
} }
// leert alle Eingabefelder // Setzt alle Eingaben zurück
private void ClearInputFields() private void EingabenLeeren()
{ {
cmbMarke.SelectedIndex = -1; cmbMarke.SelectedIndex = -1;
cmbModell.ItemsSource = null; cmbModell.ItemsSource = null;
@ -170,35 +178,35 @@ namespace FahrzeugVerwaltung
cmbMarke.Focus(); cmbMarke.Focus();
} }
// sucht Fahrzeuge nach Begriff // Sucht Fahrzeuge per Text
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();
if (string.IsNullOrWhiteSpace(suchbegriff)) if (string.IsNullOrWhiteSpace(suchbegriff))
return; return;
_aktuelleFahrzeuge = _databaseService.SucheFahrzeuge(suchbegriff); _fahrzeuge = _datenbankDienst.SucheFahrzeuge(suchbegriff);
dgFahrzeuge.ItemsSource = _aktuelleFahrzeuge; dgFahrzeuge.ItemsSource = _fahrzeuge;
UpdateStatusText(); StatusAktualisieren();
} }
// zeigt alle Fahrzeuge // Zeigt wieder alle Fahrzeuge
private void BtnAlle_Click(object sender, RoutedEventArgs e) private void BtnAlle_Click(object sender, RoutedEventArgs e)
{ {
txtSuche.Clear(); txtSuche.Clear();
LadeFahrzeuge(); FahrzeugeLaden();
} }
// reagiert auf Auswahl in der Liste // Reagiert auf Auswahl in der Tabelle
private void DgFahrzeuge_SelectionChanged(object sender, SelectionChangedEventArgs e) private void Liste_AuswahlGeaendert(object sender, SelectionChangedEventArgs e)
{ {
_ausgewaehltesFahrzeug = dgFahrzeuge.SelectedItem as Fahrzeug; _ausgewaehltesFahrzeug = dgFahrzeuge.SelectedItem as Fahrzeug;
if (_ausgewaehltesFahrzeug != null) if (_ausgewaehltesFahrzeug != null)
{ {
txtDetails.Text = $"Ausgewählt: {_ausgewaehltesFahrzeug.GetDetailedDescription()}"; txtDetails.Text = $"Ausgewählt: {_ausgewaehltesFahrzeug.HoleBeschreibung()}";
cmbMarke.SelectedItem = _ausgewaehltesFahrzeug.Marke; cmbMarke.SelectedItem = _ausgewaehltesFahrzeug.Marke;
CmbMarke_SelectionChanged(null, null); CmbMarke_AuswahlGeaendert(null, null);
cmbModell.SelectedItem = _ausgewaehltesFahrzeug.Modell; cmbModell.SelectedItem = _ausgewaehltesFahrzeug.Modell;
txtBaujahr.Text = _ausgewaehltesFahrzeug.Baujahr.ToString(); txtBaujahr.Text = _ausgewaehltesFahrzeug.Baujahr.ToString();
txtLeistung.Text = _ausgewaehltesFahrzeug.Leistung.ToString(); txtLeistung.Text = _ausgewaehltesFahrzeug.Leistung.ToString();
@ -209,12 +217,12 @@ namespace FahrzeugVerwaltung
} }
else else
{ {
UpdateStatusText(); StatusAktualisieren();
btnPdf.IsEnabled = false; btnPdf.IsEnabled = false;
} }
} }
// erstellt ein PDF zum Fahrzeug // Speichert das 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)
@ -228,18 +236,18 @@ namespace FahrzeugVerwaltung
if (dialog.ShowDialog() == true) if (dialog.ShowDialog() == true)
{ {
if (_pdfService.ErstelleFahrzeugPdf(_ausgewaehltesFahrzeug, dialog.FileName)) if (_pdfDienst.ErstelleFahrzeugPdf(_ausgewaehltesFahrzeug, dialog.FileName))
MessageBox.Show("PDF erstellt.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information); MessageBox.Show("PDF erstellt.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
} }
} }
// lädt die Liste neu // Lädt die Liste neu
private void BtnAktualisieren_Click(object sender, RoutedEventArgs e) private void BtnAktualisieren_Click(object sender, RoutedEventArgs e)
{ {
LadeFahrzeuge(); FahrzeugeLaden();
} }
// Tastenkürzel // Unterstützt einfache 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)
@ -259,15 +267,15 @@ namespace FahrzeugVerwaltung
} }
else if (e.Key == System.Windows.Input.Key.Escape) else if (e.Key == System.Windows.Input.Key.Escape)
{ {
ClearInputFields(); EingabenLeeren();
e.Handled = true; e.Handled = true;
} }
base.OnKeyDown(e); base.OnKeyDown(e);
} }
// passt Modellliste an // Aktualisiert die Modelle zur Marke
private void CmbMarke_SelectionChanged(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 einfaches PDF für ein Fahrzeug // Erstellt ein PDF mit den Daten eines Fahrzeugs
public bool ErstelleFahrzeugPdf(Fahrzeug fahrzeug, string dateiPfad) public bool ErstelleFahrzeugPdf(Fahrzeug fahrzeug, string dateiPfad)
{ {
try try
@ -31,7 +31,7 @@ namespace FahrzeugVerwaltung
} }
} }
// erstellt ein einfaches PDF mit einer Fahrzeugliste // Erstellt ein PDF mit allen Fahrzeugen
public bool ErstelleFahrzeuglistePdf(List<Fahrzeug> fahrzeuge, string dateiPfad) public bool ErstelleFahrzeuglistePdf(List<Fahrzeug> fahrzeuge, string dateiPfad)
{ {
try try