C# :: Aufgabe #209
1 Lösung

Einfaches Verwaltungstool mit CSV Import / Export
Anfänger - C#
von Exception
- 18.05.2018 um 14:31 Uhr
Der Personalchef in Firma "Bli Bla Blub & Söhne" hat nicht länger Lust, alles was Mitarbeiter betrifft, auf Zetteln zu führen bzw. zu verwalten.
Er ist sowieso der Ansicht, dass zu viele Bäume Tag für Tag abgeholzt werden...
Nun kommt er mit der Bitte zu dir, ein Programm zu entwickeln, welches ihm das Leben diesbezüglich einfacher machen soll.
Deine Aufgabe: Schreibe in der Programmiersprache deiner Wahl ein grafisches Verwaltungsprogramm.
Anforderungen an das Programm:
1) Möglichkeit Mitarbeiter anzulegen, deren Daten zu editieren bzw. Mitarbeiter zu löschen.
2) Ausgabe der Informationen aller Mitarbeiter in einer Tabelle (zur Übersichtlichkeit, während der Laufzeit).
3) Die Informationen der Tabelle sollen sortiert werden können (z.B. nach Abteilung, Geschlecht, ...) ==> noch mehr Übersichtlichkeit! :)
4) Damit die Daten nachdem das Programm geschlossen wurde nicht verloren gehen soll es zusätzlich eine Import- und Export-Funktion geben, welche alle Daten in eine CSV-Datei speichert.
4.1) Export: Es soll eine CSV-Datei erstellt werden, d.h. alle Informationen eines jeden Mitarbeiters werden via Komma, Tab, o.ä. getrennt in die Datei geschrieben. Ein Zeilenumbruch gibt an, dass nun die Informationen des nächsten Mitarbeiters kommen.
4.2) Import: Die CSV-Datei soll eingelesen werden. Aus allen Informationen eines einzelnen Mitarbeiters soll wieder ein Objekt instanziiert werden. Wenn alle Mitarbeiter importiert wurden, sollen diese wieder in der Tabelle angezeigt werden.
Hinweise:
- Export: Gib der Klasse "Mitarbeiter" vielleicht eine extra Methode, die dir deinen CSV-String bastelt (natürlich nur, wenn du auch eine Klasse "Mitarbeiter" hast ;) )
Beispiel einer kleinen CSV-Datei:
Vorname; Nachname; Geschlecht; Geburtsdatum; Abteilung/Job
Viel Freude beim entwickeln und basteln :)
Er ist sowieso der Ansicht, dass zu viele Bäume Tag für Tag abgeholzt werden...
Nun kommt er mit der Bitte zu dir, ein Programm zu entwickeln, welches ihm das Leben diesbezüglich einfacher machen soll.
Deine Aufgabe: Schreibe in der Programmiersprache deiner Wahl ein grafisches Verwaltungsprogramm.
Anforderungen an das Programm:
1) Möglichkeit Mitarbeiter anzulegen, deren Daten zu editieren bzw. Mitarbeiter zu löschen.
2) Ausgabe der Informationen aller Mitarbeiter in einer Tabelle (zur Übersichtlichkeit, während der Laufzeit).
3) Die Informationen der Tabelle sollen sortiert werden können (z.B. nach Abteilung, Geschlecht, ...) ==> noch mehr Übersichtlichkeit! :)
4) Damit die Daten nachdem das Programm geschlossen wurde nicht verloren gehen soll es zusätzlich eine Import- und Export-Funktion geben, welche alle Daten in eine CSV-Datei speichert.
4.1) Export: Es soll eine CSV-Datei erstellt werden, d.h. alle Informationen eines jeden Mitarbeiters werden via Komma, Tab, o.ä. getrennt in die Datei geschrieben. Ein Zeilenumbruch gibt an, dass nun die Informationen des nächsten Mitarbeiters kommen.
4.2) Import: Die CSV-Datei soll eingelesen werden. Aus allen Informationen eines einzelnen Mitarbeiters soll wieder ein Objekt instanziiert werden. Wenn alle Mitarbeiter importiert wurden, sollen diese wieder in der Tabelle angezeigt werden.
Hinweise:
- Export: Gib der Klasse "Mitarbeiter" vielleicht eine extra Methode, die dir deinen CSV-String bastelt (natürlich nur, wenn du auch eine Klasse "Mitarbeiter" hast ;) )
Beispiel einer kleinen CSV-Datei:
Vorname; Nachname; Geschlecht; Geburtsdatum; Abteilung/Job
Heinz; Bli; männlich; 01.01.1910; Chef
Günther; Bla; männlich; 02.02.1920; Personalchef
Erika; Blub; weiblich; 03.03.1930; Leitering Abteilung Marketing
Mannfred; Bli-Blub; männlich; 04.04.1940; Entwickler
Viel Freude beim entwickeln und basteln :)
Lösungen:
MainWindow.xaml.cs
C#-Code
Mitarbeiter.cs
C#-Code
MainWindow.xaml
XML-Code

using System.Collections.ObjectModel; using System.Linq; using System.Windows; using OpenFileDialog = System.Windows.Forms.OpenFileDialog; using SaveFileDialog = System.Windows.Forms.SaveFileDialog; namespace WpfCSVImportExport { /// <summary> /// Interaktionslogik für MainWindow.xaml /// </summary> public partial class MainWindow : Window { ObservableCollection<Mitarbeiter> mitarbeiter; public MainWindow() { InitializeComponent(); mitarbeiter = new ObservableCollection<Mitarbeiter>(); } private void Window_Loaded(object sender, RoutedEventArgs e) { System.Windows.Data.CollectionViewSource mitarbeiterViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("mitarbeiterViewSource"))); // Laden Sie Daten durch Festlegen der CollectionViewSource.Source-Eigenschaft: mitarbeiterViewSource.Source = mitarbeiter;//[generische Datenquelle] } private void buttonImportFilename_Click(object sender, RoutedEventArgs e) { char seperator; if (radioButtonImportSeperatorKomma.IsChecked == true) { seperator = ','; } else if (radioButtonImportSeperatorSemikolon.IsChecked == true) { seperator = ';'; } else if (radioButtonImportSeperatorTab.IsChecked == true) { seperator = '\t'; } else if (radioButtonImportSeperatorKomma.IsChecked == true) { if (textBoxImportSeperator.Text.Length == 1) { seperator = textBoxImportSeperator.Text.ToArray().First(); } else { MessageBox.Show("Kein Trennzeichen ausgewählt", "Kein Trennzeichen ausgewählt", MessageBoxButton.OK, MessageBoxImage.Error); return; } } else { MessageBox.Show("Kein Trennzeichen ausgewählt", "Kein Trennzeichen ausgewählt", MessageBoxButton.OK, MessageBoxImage.Error); return; } OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } textBlockImportFilename.Text = ofd.FileName; var ma = Mitarbeiter.ReadFile(ofd.FileName, seperator); mitarbeiter = new ObservableCollection<Mitarbeiter>(ma); System.Windows.Data.CollectionViewSource mitarbeiterViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("mitarbeiterViewSource"))); mitarbeiterViewSource.Source = mitarbeiter; } private void buttonExportFilename_Click(object sender, RoutedEventArgs e) { char seperator; if (radioButtonExportSeperatorKomma.IsChecked == true) { seperator = ','; } else if (radioButtonExportSeperatorSemikolon.IsChecked == true) { seperator = ';'; } else if (radioButtonExportSeperatorTab.IsChecked == true) { seperator = '\t'; } else if (radioButtonExportSeperatorKomma.IsChecked == true) { if (textBoxExportSeperator.Text.Length == 1) { seperator = textBoxExportSeperator.Text.ToArray().First(); } else { MessageBox.Show("Kein Trennzeichen ausgewählt", "Kein Trennzeichen ausgewählt", MessageBoxButton.OK, MessageBoxImage.Error); return; } } else { MessageBox.Show("Kein Trennzeichen ausgewählt", "Kein Trennzeichen ausgewählt", MessageBoxButton.OK, MessageBoxImage.Error); return; } SaveFileDialog sfd = new SaveFileDialog(); if(sfd.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } textBlockExportFilename.Text = sfd.FileName; Mitarbeiter.CreateFile(mitarbeiter, sfd.FileName, seperator); } } }
Mitarbeiter.cs

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace WpfCSVImportExport { class Mitarbeiter { public string Vorname { get; set; } public string Nachname { get; set; } public string Geschlecht { get; set; } public DateTime Geburtstag { get; set; } = DateTime.Today; public string Beruf { get; set; } static readonly string[] properties = { nameof(Vorname), nameof(Nachname), nameof(Geschlecht), nameof(Geburtstag), nameof(Beruf), }; static readonly Type Type = typeof(Mitarbeiter); static readonly Encoding Latin1 = Encoding.GetEncoding("ISO-8859-1"); public static IEnumerable<Mitarbeiter> ReadFile(string filename, char seperator) { using (StreamReader sr = new StreamReader(filename, Latin1)) { //sr.ReadLine();//Erste Zeile überspringen while (sr.Peek() != -1) { string[] line = sr.ReadLine().Split(seperator); Mitarbeiter ma = new Mitarbeiter(); for (int i = 0; i < properties.Length; i++) { string v = line.ElementAtOrDefault(i); if (string.IsNullOrEmpty(v)) { continue; } v = v.Trim(); object value = v; if (properties[i] == nameof(Geburtstag)) { DateTime date = DateTime.ParseExact(v, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture); if (DateTime.TryParseExact(v, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out date)) { value = date; } else { value = default(DateTime); } } Type.GetProperty(properties[i]).SetValue(ma, value, null); } yield return ma; } } } public static void CreateFile(IEnumerable<Mitarbeiter> mitarbeiter, string filename, char seperator) { using (StreamWriter sw = new StreamWriter(filename, false, Latin1)) { foreach (Mitarbeiter ma in mitarbeiter) { string line = ""; for (int i = 0; i < properties.Length; i++) { object value = Type.GetProperty(properties[i]).GetValue(ma, null); string v; if (value == null) { v = ""; } else { v = value.ToString(); if (value is DateTime) { DateTime date = (DateTime)value; v = date.ToString("dd.MM.yyyy"); } } line += v + seperator; } sw.WriteLine(line); } } } } }
MainWindow.xaml

<Window x:Class="WpfCSVImportExport.MainWindow" 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:WpfCSVImportExport" mc:Ignorable="d" Title="CSV-Import-Export" Height="350" Width="525" Loaded="Window_Loaded"> <Window.Resources> <CollectionViewSource x:Key="mitarbeiterViewSource" d:DesignSource="{d:DesignInstance {x:Type local:Mitarbeiter}, CreateList=True}"/> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="1*"/> </Grid.RowDefinitions> <Grid Grid.Row="0"> <Grid.ColumnDefinitions> <ColumnDefinition Width="1*"/> <ColumnDefinition Width="1*"/> </Grid.ColumnDefinitions> <GroupBox Grid.Column="0" Header="Import"> <StackPanel> <TextBlock x:Name="textBlockImportFilename" Text="ABC" Margin="10,10,0,0"/> <StackPanel Orientation="Vertical" Margin="10,10,0,0"> <TextBlock Text="Trennzeichen"/> <RadioButton x:Name="radioButtonImportSeperatorKomma" Content="Komma (,)" Margin="10,0,0,0"/> <RadioButton x:Name="radioButtonImportSeperatorSemikolon" Content="Semikolon (;)" Margin="10,0,0,0" IsChecked="True"/> <RadioButton x:Name="radioButtonImportSeperatorTab" Content="Tab" Margin="10,0,0,0"/> <RadioButton x:Name="radioButtonImportSeperatorSonstige" Content="Sonstige" Margin="10,0,0,0"/> <TextBox x:Name="textBoxImportSeperator" Width="30" MaxLength="1" IsEnabled="{Binding IsChecked, ElementName=radioButtonImportSeperatorSonstige}" Margin="10,0" HorizontalAlignment="Left" TextAlignment="Center"/> </StackPanel> <Button x:Name="buttonImportFilename" Content="Datei importieren" Margin="10" Click="buttonImportFilename_Click"/> </StackPanel> </GroupBox> <GroupBox Grid.Column="1" Header="Export"> <StackPanel> <TextBlock x:Name="textBlockExportFilename" Text="ABC" Margin="10,10,0,0"/> <StackPanel Orientation="Vertical" Margin="10,10,0,0"> <TextBlock Text="Trennzeichen"/> <RadioButton x:Name="radioButtonExportSeperatorKomma" Content="Komma (,)" Margin="10,0,0,0"/> <RadioButton x:Name="radioButtonExportSeperatorSemikolon" Content="Semikolon (;)" Margin="10,0,0,0" IsChecked="True"/> <RadioButton x:Name="radioButtonExportSeperatorTab" Content="Tab" Margin="10,0,0,0"/> <RadioButton x:Name="radioButtonExportSeperatorSonstige" Content="Sonstige" Margin="10,0,0,0"/> <TextBox x:Name="textBoxExportSeperator" Width="30" MaxLength="1" IsEnabled="{Binding IsChecked, ElementName=radioButtonExportSeperatorSonstige}" Margin="10,0" HorizontalAlignment="Left" TextAlignment="Center"/> </StackPanel> <Button x:Name="buttonExportFilename" Content="Datei exportieren" Margin="10" Click="buttonExportFilename_Click"/> </StackPanel> </GroupBox> </Grid> <Grid Grid.Row="1" DataContext="{StaticResource mitarbeiterViewSource}" Margin="10"> <DataGrid x:Name="mitarbeiterDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" RowDetailsVisibilityMode="VisibleWhenSelected"> <DataGrid.Columns> <DataGridTextColumn x:Name="vornameColumn" Binding="{Binding Vorname}" Header="Vorname" Width="SizeToHeader"/> <DataGridTextColumn x:Name="nachnameColumn" Binding="{Binding Nachname}" Header="Nachname" Width="SizeToHeader"/> <DataGridTextColumn x:Name="geschlechtColumn" Binding="{Binding Geschlecht}" Header="Geschlecht" Width="SizeToHeader"/> <DataGridTemplateColumn x:Name="geburtstagColumn" Header="Geburtstag" Width="SizeToHeader" SortMemberPath="Geburtstag"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <DatePicker SelectedDate="{Binding Geburtstag, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn x:Name="berufColumn" Binding="{Binding Beruf}" Header="Beruf" Width="SizeToHeader"/> </DataGrid.Columns> </DataGrid> </Grid> </Grid> </Window>