Deutsche Kommentare und moderne Fahrzeugverwaltung
This commit is contained in:
parent
b0bb865a87
commit
7b2c38cc4e
@ -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.
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
|
@ -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})";
|
||||||
}
|
}
|
||||||
|
@ -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"/>
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user