Compare commits

...

4 Commits

Author SHA1 Message Date
92893665fe Aufgabe OR-Mapper 2025-06-16 15:01:00 +02:00
8813c83ed9 Einfugen neuer 2025-06-02 17:16:38 +02:00
99640602f5 Leere Liste nur in GUI 2025-06-02 16:36:48 +02:00
5b2b05ed55 Löschen Knopf 2025-06-02 16:26:06 +02:00
13 changed files with 247 additions and 8 deletions

View File

@@ -0,0 +1,25 @@
using Microsoft.EntityFrameworkCore;
namespace FahrzeugDatenBank;
public class DatenbankKontext : DbContext
{
private readonly string _connectionString;
public DatenbankKontext(string connectionString)
{
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySql(_connectionString, ServerVersion.AutoDetect(_connectionString));
}
public DbSet<FahrzeugDTO> Fahrzeuge { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<FahrzeugDTO>().HasKey(e => e.Id);
}
}

View File

@@ -1,8 +1,14 @@
namespace FahrzeugDatenBank;
using System.ComponentModel.DataAnnotations.Schema;
namespace FahrzeugDatenBank;
[Table("fahrzeuge")]
public class FahrzeugDTO
{
[Column("id")]
public int Id { get; set; }
[Column("fahrzeug_name")]
public string? Name { get; set; }
[Column("fahrzeug_typ")]
public string? Typ { get; set; }
}

View File

@@ -7,7 +7,10 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.17" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.17" />
<PackageReference Include="MySqlConnector" Version="2.4.0" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.3" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,47 @@

namespace FahrzeugDatenBank;
public class FahrzeugOrmRepository : IFahrzeugRepository
{
private readonly DatenbankKontext _kontext;
public FahrzeugOrmRepository(DatenbankKontext kontext)
{
this._kontext = kontext;
}
public void AktualisiereFahrzeug(int id, string fahrzeugName, string fahrzeugTyp)
{
FahrzeugDTO fahrzeug = _kontext.Fahrzeuge.First(f => f.Id == id);
fahrzeug.Name = fahrzeugName;
fahrzeug.Typ = fahrzeugTyp;
_kontext.SaveChanges();
}
public void FuegeFahrzeugEin(string fahrzeugName, string fahrzeugTyp)
{
_kontext.Fahrzeuge.Add(new FahrzeugDTO() { Name = fahrzeugName, Typ = fahrzeugTyp });
_kontext.SaveChanges();
}
public FahrzeugDTO GetFahrzeugByID(int id)
{
return _kontext.Fahrzeuge.First(f => f.Id == id);
}
public List<FahrzeugDTO> HoleAlleFahrzeuge()
{
return _kontext.Fahrzeuge.ToList();
}
public void LoescheFahrzeug(int id)
{
_kontext.Fahrzeuge.Remove(GetFahrzeugByID(id));
_kontext.SaveChanges();
}
public List<FahrzeugDTO> SucheFahrzeuge(string searchTerm)
{
return _kontext.Fahrzeuge.Where(f => f.Name.Contains(searchTerm) || f.Typ.Contains(searchTerm)).ToList();
}
}

View File

@@ -2,7 +2,7 @@
namespace FahrzeugDatenBank;
public class FahrzeugRepository
public class FahrzeugRepository : IFahrzeugRepository
{
private string _connectionString;

View File

@@ -0,0 +1,13 @@

namespace FahrzeugDatenBank
{
public interface IFahrzeugRepository
{
void AktualisiereFahrzeug(int id, string fahrzeugName, string fahrzeugTyp);
void FuegeFahrzeugEin(string fahrzeugName, string fahrzeugTyp);
FahrzeugDTO GetFahrzeugByID(int id);
List<FahrzeugDTO> HoleAlleFahrzeuge();
void LoescheFahrzeug(int id);
List<FahrzeugDTO> SucheFahrzeuge(string searchTerm);
}
}

View File

@@ -21,8 +21,12 @@ namespace FahzeugWPF
ServiceCollection services = new ServiceCollection();
services.AddScoped<IKonfigurationsleser>(sp => new Konfigurationsleser(configuration));
services.AddScoped(sp => new FahrzeugRepository(sp.GetRequiredService<IKonfigurationsleser>().LiesDBVerebindung()));
services.AddScoped(sp => new DatenbankKontext(sp.GetRequiredService<IKonfigurationsleser>().LiesDBVerebindung()));
// services.AddScoped<IFahrzeugRepository>(sp => new FahrzeugRepository(sp.GetRequiredService<IKonfigurationsleser>().LiesDBVerebindung()));
services.AddScoped<IFahrzeugRepository, FahrzeugOrmRepository>();
services.AddScoped<FahrzeugeModell>();
services.AddScoped<EinfuegenModel>();
services.AddScoped<EinfuegenWindow>();
services.AddSingleton<MainWindowViewModel>();
services.AddSingleton<MainWindow>();

View File

@@ -0,0 +1,29 @@
using System.Windows;
using System.Windows.Input;
namespace FahzeugWPF;
class EinfuegenModel : ViewModelBase
{
private readonly FahrzeugeModell _fahrzeugeModell;
public EinfuegenModel(FahrzeugeModell model)
{
this._fahrzeugeModell = model;
EinfuegenKommando = new RelayCommand(Einfugen);
}
public string NeuesrFahrzeugName { get; set; }
public string NeuerFahrzeugTyp { get; set; }
public ICommand EinfuegenKommando { get; private set; }
private void Einfugen(object? o)
{
if (string.IsNullOrEmpty(NeuerFahrzeugTyp) || string.IsNullOrEmpty(NeuesrFahrzeugName)) { return; }
_fahrzeugeModell.EinfuegenFahrzeug(NeuesrFahrzeugName, NeuerFahrzeugTyp);
if (o is Window window)
{
window.Close();
}
}
}

View File

@@ -0,0 +1,17 @@
<Window x:Class="FahzeugWPF.EinfuegenWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:FahzeugWPF"
mc:Ignorable="d"
x:Name="EinfuegenFenster"
Title="Fahrzeug Einfuegen" Height="300" Width="500">
<StackPanel>
<TextBlock Margin="1" Text="Neuse Fahrzeug" VerticalAlignment="Top" />
<TextBox HorizontalAlignment="Left" Margin="1" TextWrapping="Wrap" Width="498" Text="{Binding Path=NeuesrFahrzeugName}" />
<TextBlock Margin="1" Text="Fahrzeugtyp" VerticalAlignment="Top"/>
<TextBox HorizontalAlignment="Left" Margin="1" TextWrapping="Wrap" Width="498" Text="{Binding Path=NeuerFahrzeugTyp}"/>
<Button Content="Einfügen" HorizontalAlignment="Left" Margin="1" VerticalAlignment="Top" Command="{Binding Path=EinfuegenKommando}" CommandParameter="{Binding ElementName=EinfuegenFenster}"/>
</StackPanel>
</Window>

View File

@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace FahzeugWPF
{
/// <summary>
/// Interaction logic for EinfuegenWindow.xaml
/// </summary>
public partial class EinfuegenWindow : Window
{
public EinfuegenWindow()
{
InitializeComponent();
}
}
}

View File

@@ -4,9 +4,9 @@ namespace FahzeugWPF;
class FahrzeugeModell
{
private readonly FahrzeugRepository _repository;
private readonly IFahrzeugRepository _repository;
public FahrzeugeModell(FahrzeugRepository repository)
public FahrzeugeModell(IFahrzeugRepository repository)
{
this._repository = repository;
}
@@ -21,6 +21,16 @@ class FahrzeugeModell
return fahrzeugListe;
}
public void LoescheFahrzeug(Fahrzeug fahrzeug)
{
_repository.LoescheFahrzeug(fahrzeug.Id);
}
public void EinfuegenFahrzeug(string faName, string faType)
{
_repository.FuegeFahrzeugEin(faName, faType);
}
private IEnumerable<Fahrzeug> KonvertiereFahrzeuge(IEnumerable<FahrzeugDTO> fahrzeugs)
{
return fahrzeugs.Select(fahrzeug => KonvertiereFahrzeuf(fahrzeug));

View File

@@ -8,7 +8,14 @@
d:DataContext="{d:DesignInstance Type=local:MainWindowViewModel, IsDesignTimeCreatable=False}"
Title="{Binding Path=MainWindowTitle}" Height="450" Width="800">
<StackPanel>
<DataGrid Name="dgTest"
<Menu>
<MenuItem Header="Liste">
<MenuItem Header="Liste leeren"
Command="{Binding Path=LeerenKommando}"/>
</MenuItem>
<MenuItem Header="Einfügen" Command="{Binding Path=Einfugen}"/>
</Menu>
<DataGrid x:Name="fahrzeugTabelle"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserSortColumns="True"
@@ -18,6 +25,13 @@
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Path=Id}"/>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Command="{Binding ElementName=fahrzeugTabelle, Path=DataContext.LoeschenKommando}" CommandParameter="{Binding}">Löschen</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

View File

@@ -1,6 +1,9 @@
using FahrzeugDatenBank;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.ObjectModel;
using System.Timers;
using System.Windows;
using System.Windows.Input;
namespace FahzeugWPF;
@@ -19,11 +22,23 @@ class MainWindowViewModel : ViewModelBase
this._timer.Start();
this._model = modell;
this.InitialisiereDasViewModell();
this.LoeschenKommando = new RelayCommand(LoescheFahrzeug);
this.LeerenKommando = new RelayCommand(LeereListe);
this.Einfugen = new RelayCommand(EinfugenMachen);
}
public string MainWindowTitle { get { return _mainWindowTitle; } set {
public ICommand LoeschenKommando { get; private set; }
public ICommand LeerenKommando { get; private set; }
public ICommand Einfugen { get; private set; }
public string MainWindowTitle
{
get { return _mainWindowTitle; }
set
{
SetProperty<string>(ref _mainWindowTitle, value);
} }
}
}
public ObservableCollection<Fahrzeug> Fahrzeuge { get; } = new ObservableCollection<Fahrzeug>();
@@ -40,4 +55,33 @@ class MainWindowViewModel : ViewModelBase
{
this.MainWindowTitle = $"Fahrzeuge {DateTime.Now.ToLongTimeString()}";
}
private void LoescheFahrzeug(object? fahrzeug)
{
if (fahrzeug == null)
return;
_model.LoescheFahrzeug((Fahrzeug)fahrzeug);
this.Fahrzeuge.Remove((Fahrzeug)fahrzeug);
}
private async void LeereListe(object? o)
{
await Task.Run(() =>
{
Application.Current.Dispatcher.Invoke(() =>
{
this.Fahrzeuge.Clear();
});
});
}
private void EinfugenMachen(object? o)
{
var einfuege = App.ServiceProvider.GetService<EinfuegenWindow>();
einfuege.DataContext = App.ServiceProvider.GetService<EinfuegenModel>();
einfuege.ShowDialog();
LeereListe(o);
InitialisiereDasViewModell();
}
}