projektAutoHandlung/WpfApp4/MainWindow.xaml.cs
2025-08-31 23:33:31 +02:00

344 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Win32;
namespace FahrzeugVerwaltung
{
public partial class MainWindow : Window
{
private DatabaseService _datenbankDienst;
private PdfService _pdfDienst;
private List<Fahrzeug> _fahrzeuge;
private Fahrzeug _ausgewaehltesFahrzeug;
private Dictionary<string, List<string>> _markenModelle;
public MainWindow()
{
InitializeComponent();
DiensteAnlegen();
MarkenVorbereiten();
FahrzeugeLaden();
}
// Erzeugt Dienstobjekte
private void DiensteAnlegen()
{
_datenbankDienst = new DatabaseService();
_pdfDienst = new PdfService();
_fahrzeuge = new List<Fahrzeug>();
}
// Füllt die Listen mit Marken und Modellen
private void MarkenVorbereiten()
{
_markenModelle = new Dictionary<string, List<string>>
{
{"Audi", new List<string>{"A3","A4","A6","Q3","Q5","Q7"}},
{"BMW", new List<string>{"1er","3er","5er","X1","X3","X5"}},
{"Mercedes", new List<string>{"A-Klasse","C-Klasse","E-Klasse","GLA","GLC","GLE"}},
{"Volkswagen", new List<string>{"Golf","Passat","Polo","Tiguan","T-Roc","Arteon"}},
{"Opel", new List<string>{"Corsa","Astra","Insignia","Mokka","Crossland","Grandland"}},
{"Ford", new List<string>{"Fiesta","Focus","Mondeo","Kuga","Puma","S-MAX"}},
{"Toyota", new List<string>{"Yaris","Corolla","Camry","RAV4","C-HR","Auris"}},
{"Honda", new List<string>{"Civic","Accord","Jazz","CR-V","HR-V","NSX"}},
{"Hyundai", new List<string>{"i20","i30","i40","Tucson","Santa Fe","Kona"}},
{"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"}},
{"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"}},
{"Dodge", new List<string>{"Charger","Challenger","Durango","Journey","Ram","Viper"}},
{"Chrysler", new List<string>{"200","300","Pacifica","Voyager","Aspen","Sebring"}},
{"Buick", new List<string>{"Encore","Enclave","LaCrosse","Regal","Verano","Envision"}},
{"Cadillac", new List<string>{"ATS","CTS","Escalade","XT5","XT4","CT6"}},
{"Infiniti", new List<string>{"Q50","Q60","Q70","QX50","QX60","QX80"}},
{"Acura", new List<string>{"ILX","TLX","RLX","MDX","RDX","NSX"}},
{"Suzuki", new List<string>{"Swift","Vitara","Baleno","Jimny","SX4","Ignis"}},
{"Saab", new List<string>{"9-3","9-5","900","9-4X","9-7X","96"}},
{"Lincoln", new List<string>{"MKZ","MKX","Continental","Navigator","Corsair","Aviator"}},
{"Bentley", new List<string>{"Continental GT","Flying Spur","Bentayga","Mulsanne","Arnage","Azure"}}
};
cmbMarke.ItemsSource = _markenModelle.Keys;
}
// Holt Fahrzeuge aus der Datenbank
private void FahrzeugeLaden()
{
_fahrzeuge = _datenbankDienst.LadeAlleFahrzeuge();
dgFahrzeuge.ItemsSource = _fahrzeuge;
StatusAktualisieren();
}
// Aktualisiert die Statuszeile
private void StatusAktualisieren()
{
if (_fahrzeuge.Count == 0)
{
txtDetails.Text = "Keine Fahrzeuge vorhanden";
}
else
{
txtDetails.Text = $"{_fahrzeuge.Count} Fahrzeug(e) gefunden";
}
}
// Speichert ein neues Fahrzeug
private void BtnHinzufuegen_Click(object sender, RoutedEventArgs e)
{
if (!EingabenPruefen())
{
return;
}
Fahrzeug fahrzeug = new Fahrzeug
{
Marke = cmbMarke.SelectedItem.ToString(),
Modell = cmbModell.SelectedItem.ToString(),
Baujahr = int.Parse(txtBaujahr.Text.Trim()),
Leistung = int.Parse(txtLeistung.Text.Trim()),
Kilometerstand = int.Parse(txtKilometer.Text.Trim()),
Kaufpreis = decimal.Parse(txtKaufpreis.Text.Trim()),
Farbe = txtFarbe.Text.Trim()
};
fahrzeug.Id = _datenbankDienst.SpeichereFahrzeug(fahrzeug);
MessageBox.Show("Fahrzeug gespeichert.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
EingabenLeeren();
FahrzeugeLaden();
}
// Übernimmt Änderungen
private void BtnBearbeiten_Click(object sender, RoutedEventArgs e)
{
if (_ausgewaehltesFahrzeug == null || !EingabenPruefen())
{
return;
}
_ausgewaehltesFahrzeug.Marke = cmbMarke.SelectedItem.ToString();
_ausgewaehltesFahrzeug.Modell = cmbModell.SelectedItem.ToString();
_ausgewaehltesFahrzeug.Baujahr = int.Parse(txtBaujahr.Text.Trim());
_ausgewaehltesFahrzeug.Leistung = int.Parse(txtLeistung.Text.Trim());
_ausgewaehltesFahrzeug.Kilometerstand = int.Parse(txtKilometer.Text.Trim());
_ausgewaehltesFahrzeug.Kaufpreis = decimal.Parse(txtKaufpreis.Text.Trim());
_ausgewaehltesFahrzeug.Farbe = txtFarbe.Text.Trim();
if (_datenbankDienst.AktualisiereFahrzeug(_ausgewaehltesFahrzeug))
{
MessageBox.Show("Fahrzeug aktualisiert.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
}
FahrzeugeLaden();
}
// Entfernt das gewählte Fahrzeug
private void BtnLoeschen_Click(object sender, RoutedEventArgs e)
{
if (_ausgewaehltesFahrzeug == null)
{
return;
}
if (MessageBox.Show("Fahrzeug wirklich löschen?", "Bestätigung", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
if (_datenbankDienst.LoescheFahrzeug(_ausgewaehltesFahrzeug.Id))
{
MessageBox.Show("Fahrzeug gelöscht.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
EingabenLeeren();
FahrzeugeLaden();
}
}
}
// Prüft alle Eingaben
private bool EingabenPruefen()
{
List<string> fehler = new List<string>();
if (cmbMarke.SelectedItem == null)
{
fehler.Add("Marke wählen");
}
if (cmbModell.SelectedItem == null)
{
fehler.Add("Modell wählen");
}
if (!int.TryParse(txtBaujahr.Text, out int baujahr) || baujahr < 1900 || baujahr > DateTime.Now.Year)
{
fehler.Add($"Baujahr zwischen 1900 und {DateTime.Now.Year}");
}
if (!int.TryParse(txtLeistung.Text, out int leistung) || leistung <= 0)
{
fehler.Add("Leistung muss positiv sein");
}
if (!int.TryParse(txtKilometer.Text, out int kilometer) || kilometer < 0)
{
fehler.Add("Kilometerstand muss 0 oder größer sein");
}
if (!decimal.TryParse(txtKaufpreis.Text, out decimal kaufpreis) || kaufpreis <= 0)
{
fehler.Add("Kaufpreis muss positiv sein");
}
if (string.IsNullOrWhiteSpace(txtFarbe.Text))
{
fehler.Add("Farbe angeben");
}
if (fehler.Any())
{
MessageBox.Show(string.Join("\n", fehler), "Eingabefehler", MessageBoxButton.OK, MessageBoxImage.Warning);
return false;
}
return true;
}
// Leert alle Eingabefelder
private void EingabenLeeren()
{
cmbMarke.SelectedIndex = -1;
cmbModell.ItemsSource = null;
txtBaujahr.Clear();
txtLeistung.Clear();
txtKilometer.Clear();
txtKaufpreis.Clear();
txtFarbe.Clear();
cmbMarke.Focus();
}
// Sucht nach einem Begriff
private void BtnSuchen_Click(object sender, RoutedEventArgs e)
{
string suchbegriff = txtSuche.Text.Trim();
if (string.IsNullOrWhiteSpace(suchbegriff))
{
return;
}
_fahrzeuge = _datenbankDienst.SucheFahrzeuge(suchbegriff);
dgFahrzeuge.ItemsSource = _fahrzeuge;
StatusAktualisieren();
}
// Zeigt alle Fahrzeuge
private void BtnAlle_Click(object sender, RoutedEventArgs e)
{
txtSuche.Clear();
FahrzeugeLaden();
}
// Reagiert auf Auswahl in der Tabelle
private void Liste_AuswahlGeaendert(object sender, SelectionChangedEventArgs e)
{
_ausgewaehltesFahrzeug = dgFahrzeuge.SelectedItem as Fahrzeug;
if (_ausgewaehltesFahrzeug != null)
{
txtDetails.Text = $"Ausgewählt: {_ausgewaehltesFahrzeug.HoleBeschreibung()}";
cmbMarke.SelectedItem = _ausgewaehltesFahrzeug.Marke;
CmbMarke_AuswahlGeaendert(null, null);
cmbModell.SelectedItem = _ausgewaehltesFahrzeug.Modell;
txtBaujahr.Text = _ausgewaehltesFahrzeug.Baujahr.ToString();
txtLeistung.Text = _ausgewaehltesFahrzeug.Leistung.ToString();
txtKilometer.Text = _ausgewaehltesFahrzeug.Kilometerstand.ToString();
txtKaufpreis.Text = _ausgewaehltesFahrzeug.Kaufpreis.ToString();
txtFarbe.Text = _ausgewaehltesFahrzeug.Farbe;
btnPdf.IsEnabled = true;
}
else
{
StatusAktualisieren();
btnPdf.IsEnabled = false;
}
}
// Erstellt ein PDF für das gewählte Fahrzeug
private void BtnPdf_Click(object sender, RoutedEventArgs e)
{
if (_ausgewaehltesFahrzeug == null)
{
return;
}
SaveFileDialog dialog = new SaveFileDialog
{
Filter = "PDF-Dateien (*.pdf)|*.pdf",
FileName = $"Fahrzeug_{_ausgewaehltesFahrzeug.Marke}_{_ausgewaehltesFahrzeug.Modell}_{DateTime.Now:yyyyMMdd_HHmmss}.pdf"
};
if (dialog.ShowDialog() == true)
{
if (_pdfDienst.ErstelleFahrzeugPdf(_ausgewaehltesFahrzeug, dialog.FileName))
{
MessageBox.Show("PDF erstellt.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
}
// Lädt die Daten neu
private void BtnAktualisieren_Click(object sender, RoutedEventArgs e)
{
FahrzeugeLaden();
}
// Tastenkürzel für Aktionen
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)
{
BtnHinzufuegen_Click(null, null);
e.Handled = true;
}
else if (e.Key == System.Windows.Input.Key.F && System.Windows.Input.Keyboard.Modifiers == System.Windows.Input.ModifierKeys.Control)
{
txtSuche.Focus();
e.Handled = true;
}
else if (e.Key == System.Windows.Input.Key.F5)
{
BtnAktualisieren_Click(null, null);
e.Handled = true;
}
else if (e.Key == System.Windows.Input.Key.Escape)
{
EingabenLeeren();
e.Handled = true;
}
base.OnKeyDown(e);
}
// Zeigt Modelle zur gewählten Marke
private void CmbMarke_AuswahlGeaendert(object sender, SelectionChangedEventArgs e)
{
if (cmbMarke.SelectedItem == null)
{
cmbModell.ItemsSource = null;
return;
}
string marke = cmbMarke.SelectedItem.ToString();
cmbModell.ItemsSource = _markenModelle[marke];
}
}
}