using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using Example.Model; using Example.Ui; namespace Spielwiese { class Program { //Einstiegspunkt in unsere Anwendung. public static void Main() => new Example.Context().Run(); } } namespace Example { //der Programmkontext. Nur er kennt die Liste von Personen (_people). //Er benutzt den View, um vom Benutzer Eingaben zu empfangen und auf diese zu reagieren. //Er gibt auch vor, wie sich das Programm verhalten soll: wann wird welches Menü engezeigt, wann wird beendet, wie heissen die Menüpunkt usw. public class Context { private readonly ConsoleUi _view = new ConsoleUi(new [] { "Neue Person anlegen", "Person anzeigen", "Person bearbeiten", "Person löschen" }); private readonly List _people = new List(); private Person _selectedPerson; public void Run() { while (true) { _view.ShowMainMenu(); var subMenu = _view.GetUserInput(); if (subMenu == "quit") break; switch (subMenu) { case "Neue Person anlegen": var newPerson = _view.ShowAddUserMenu(); if (newPerson != null) _people.Add(newPerson); break; case "Person anzeigen": _selectedPerson = _view.GetPerson(_people); _view.ShowPerson(_selectedPerson); break; case "Person bearbeiten": _selectedPerson = _view.GetPerson(_people); _view.EditPerson(_selectedPerson); break; case "Person löschen": _selectedPerson= _view.GetPerson(_people); if(_selectedPerson != null) _people.Remove(_selectedPerson); break; } } } } } namespace Example.Ui { //kümmert sich um Interaktion mit dem Benutzer: Daten anzeigen, Eingaben entgegennehmen public class ConsoleUi { private readonly string[] _mainMenu; private string[] _currentMenu; public ConsoleUi(string[] mainMenu) { _mainMenu = mainMenu; } public void ShowMainMenu() { Console.Clear(); _currentMenu = _mainMenu; _mainMenu.Select((menuItem, index) => $"({index + 1, 3}) {menuItem}").ToList().ForEach(Console.WriteLine); ShowExitMenu('Q', "Beenden"); } public string GetUserInput() { while (true) { var input = Console.ReadKey(true); if (char.IsNumber(input.KeyChar) && int.TryParse(input.KeyChar.ToString(), out var result) && result > 0 && result <= _currentMenu.Length) return _currentMenu[result - 1]; if (input.Key == ConsoleKey.Q) return "quit"; } } private void ShowExitMenu(char shortcut, string text) { Console.WriteLine(string.Empty.PadRight(80, '_')); Console.WriteLine($"({shortcut}) {text}"); } public Person ShowAddUserMenu() { var result = new Person(); Console.Clear(); Console.Write("Vorname: "); result.GivenName = Console.ReadLine(); if (string.IsNullOrWhiteSpace(result.GivenName)) return null; Console.Write("Nachname: "); result.FamilyName = Console.ReadLine(); if (string.IsNullOrWhiteSpace(result.FamilyName)) return null; Console.Write("Geburtsdatum: "); if (!DateTime.TryParse(Console.ReadLine(), out var dob)) return null; result.DateOfBirth = dob; return result; } public Person GetPerson(List people) { while (true) { Console.Clear(); people .Select((person, i) => $"({i + 1}) {person.GivenName} {person.FamilyName}") .ToList() .ForEach(Console.WriteLine); ShowExitMenu('Z', "Zurück zum Hauptmenü"); var input = Console.ReadLine(); if (StringComparer.CurrentCultureIgnoreCase.Equals("Z", input)) return null; if (int.TryParse(input, out var index) && people.Count >= index && index > 0) return people[index - 1]; } } public void ShowPerson(Person person) { if (person == null) return; Console.Clear(); Console.WriteLine($"Vorname: {person.GivenName}"); Console.WriteLine($"Nachname: {person.FamilyName}"); Console.WriteLine($"Geburtstag: {person.DateOfBirth:dd.MM.yyyy}"); Console.ReadKey(); } public void EditPerson(Person person) { if (person == null) return; Console.Clear(); Console.Write("Vorname: "); SendKeys.SendWait(person.GivenName); var givenName = Console.ReadLine(); if (string.IsNullOrEmpty(givenName)) return; Console.Write("Nachname: "); SendKeys.SendWait(person.FamilyName); var familyName = Console.ReadLine(); if (string.IsNullOrEmpty(familyName)) return; Console.Write("Geburtstag: "); SendKeys.SendWait(person.DateOfBirth.ToString("dd.MM.yyyy")); var dob = Console.ReadLine(); if (string.IsNullOrEmpty(dob)) return; if (!DateTime.TryParse(dob, out var newDob)) return; person.GivenName = givenName; person.FamilyName = familyName; person.DateOfBirth = newDob; } } } namespace Example.Model { //das Modell einer Person. Wird vom Kontext benutzt, der eine Liste dieser Objekte hält und mit Hilfe der Ui bearbeitet/verändert. public class Person { public string GivenName { get; set; } public string FamilyName { get; set; } public DateTime DateOfBirth { get; set; } } }