using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Übungen_LF6_WinFormanwendung { public partial class SaalBuchen : Form { //Properties: //Anzahl Reihen im Saal (Zwischenspeicher Variable) int maxReihen = 0; //Anzahl Sitze pro Reihe im Saal (Zwischenspeicher Variable) int maxSpalten = 0; //Name des Saals (Zwischenspeicher Variable) string saalName; //Saal Objekt (Zwischenspeicher Variable) Saal aktiverSaal = new Saal(); //Buttons der Sitzplätze private Button[,] buttons; public SaalBuchen() { InitializeComponent(); } //Schließen der Applikation private void button_ende_Click(object sender, EventArgs e) { this.Close(); } // Eventhandler für erstellen eines neuen Saales private void button_erstelleSaal_Click(object sender, EventArgs e) { int ErrorCode = 0; //Userinput : Erstellen eines Saals nur wenn Werte gefüllt if (textBox_name.Text != "" && textBox_spalten.Text != "" && textBox_reihen.Text != "") { // Füllen der Feldinhalte für erstellen des Saales saalName = textBox_name.Text; maxReihen = Convert.ToInt32(textBox_reihen.Text); maxSpalten = Convert.ToInt32(textBox_spalten.Text); // Methodenaufruf zur Erstellung des Saales erstellenSitzplan(saalName, maxReihen, maxSpalten); } else { //Fehlermeldung für fehlende Eingaben ErrorCode = 10; checkErrors(ErrorCode); } } //Zeichnen des Sitzplanes in die Windowsform - Aufruf über Name und Größe des Saals private void erstellenSitzplan(string Input_saalName, int Input_maxReihen, int Input_maxSpalten) { int ErrorCode = 0; //Erstellung eines Temporären Saalobjekts zur Weiterleitung der Daten als Objekt Saal currentSaal = new Saal(out ErrorCode, saalName, maxReihen , maxSpalten ); //Falls Fehler bei Erstellung des Saalobjekts (Zu groß/klein etc) kein erstellen des Saals if (checkErrors(ErrorCode)) { erstellenSitzplan(currentSaal); } } //Zeichnen des Sitzplanes in die Windowsform - Aufruf über Saalobjekt private void erstellenSitzplan(Saal saal) { //übernahme des Parameter-Saals aktiverSaal = new Saal (saal); //Buttons für die Sitzplatzanzeige buttons = new Button[aktiverSaal.maxReihen + 1, aktiverSaal.maxSpalten + 1]; //bereinigen der Einstellungen falls erneut erstellt wird oder geladen wird Leinwand_Groupbox.Controls.Clear(); //Größe des Anzeigefensters (Leinwand-Groupbox) int saalBreite = Leinwand_Groupbox.Size.Width; int saalLänge = Leinwand_Groupbox.Size.Height; //Abstände der Buttons von den Rändern int aktuellePos_X = 20; int aktuellePos_Y = 20; //Breite eines Buttons int button_Swidth = (saalBreite-(aktuellePos_X*2)) / aktiverSaal.maxSpalten; //Höhe eines Buttons int button_Sheight = (saalLänge-(aktuellePos_Y*2))/ aktiverSaal.maxReihen; //Sitzplatzerstellung für den erstellten Saal //Generierung einer Button-Darstellung der Sitzplatzbelegung mittels Schleife for (int reihe = 1; reihe <= aktiverSaal.maxReihen ; reihe++) { //Initialisieren der Position des ersten Buttons einer Reihe aktuellePos_X = 20 ; for (int spalte = 1; spalte <= aktiverSaal.maxSpalten ; spalte++) { Button button = new Button(); buttons[reihe, spalte] = button; //Buttoneigenschaften button.Click += new EventHandler(this.button_sitzMark_Click); button.Tag = (reihe + spalte).ToString(); button.Width = button_Swidth; button.Height = button_Sheight; button.Left = aktuellePos_X; button.Top = aktuellePos_Y; //Buttontext muss für bessere leserlichkeit für alle Sitzplatznummern unter 10 eine "0" zwischen //Reihe und Zeile einfügen um Illusion von Zahlen im 100er bereich zu erzeugen if (spalte < 10) button.Text = reihe.ToString() + "0" + spalte.ToString(); else button.Text = reihe.ToString() + spalte.ToString(); //Buttonfarbe als Indikator für Verfügbarkeit | Grün = Verfügbar, Rot = Reserviert (Gelb = Markiert) if (aktiverSaal.istFrei(reihe, spalte)) button.BackColor = Color.ForestGreen; else button.BackColor = Color.MediumVioletRed; //Hinzufügen des neuen Buttons in das Steuerelement Leinwand_Groupbox zur Darstellung für den User Leinwand_Groupbox.Controls.Add(button); //Weiterbewegen des Positionspunktes des nächsten Buttons aktuellePos_X += button_Swidth; } //Weiter bewegen um eine Reihe nach unten um dort das Reihe zeichnen wieder neu anzusetzen aktuellePos_Y += button_Sheight; } } //Click-Handler aller generierten Sitzplatzbuttons private void button_sitzMark_Click(object sender, EventArgs e) { //Senderbutton finden und seinen Hintergrund ändern for (int reihe = 1; reihe <= aktiverSaal.maxReihen; reihe++) { for (int spalte = 1; spalte <= aktiverSaal.maxSpalten; spalte++) { //Vergleich des sendersbuttons mit den vorhandenen Displaybuttons Button checkButton = new Button(); checkButton = buttons[reihe, spalte]; if (sender == checkButton) { //Wenn der Sitzplatz als Markiert gilt wird wird entmarkiert ansonsten wird Gelb markiert if (!aktiverSaal.istMarkiert(reihe, spalte)) { buttons[reihe,spalte].BackColor = Color.Yellow; aktiverSaal.markiereSitz(reihe, spalte); } else { //Wenn Sitz frei ist dann wird er Grün gefärbt ansonsten Rot if (aktiverSaal.istFrei(reihe, spalte)) { buttons[reihe, spalte].BackColor = Color.ForestGreen; aktiverSaal.markiereSitz(reihe, spalte); } else { buttons[reihe, spalte].BackColor = Color.MediumVioletRed; aktiverSaal.markiereSitz(reihe, spalte); } } } } } } //Saal wird gespeichert private void button_saveSaal_Click(object sender, EventArgs e) { int ErrorCode = 0; //Speichern ist nicht möglich wenn keine Daten eingegeben | Achtung keine Absicherung gegen Überschreibung! if (aktiverSaal.nameSaal != null && aktiverSaal.maxReihen != 0 && aktiverSaal.maxSpalten != 0) aktiverSaal.speichernSaal(out ErrorCode); else ErrorCode = 10; checkErrors(ErrorCode); } //Saal wird geladen private void button_ladeSaal_Click(object sender, EventArgs e) { int ErrorCode = 0; aktiverSaal.ladeSaal(out ErrorCode, textBox_name.Text); if (checkErrors(ErrorCode)) { erstellenSitzplan(aktiverSaal); textBox_reihen.Text = aktiverSaal.maxReihen.ToString(); textBox_spalten.Text = aktiverSaal.maxSpalten.ToString(); } } //Buchen der markierten Sitzplätze private void button_buchen_Click(object sender, EventArgs e) { int ErrorCode = 0; //Wenn buchen geklickt obwohl noch kein Saal aktiv ist -> Fehler if (aktiverSaal != null) { //Durchsuchen aller markierten Buttons nach Markierung und buchen dieser Sitze MessageBox.Show("Folgende Sitze wurden für Sie gebucht:"); for (int reihe = 1; reihe <= aktiverSaal.maxReihen; reihe++) { for (int spalte = 1; spalte <= aktiverSaal.maxSpalten; spalte++) { //Wenn Sitz "markiert" dann wird dieser gebucht und als besetzt markiert if (aktiverSaal.istMarkiert(reihe, spalte)) { //Wenn sitz zwar markiert aber nicht frei dann wird nicht gebucht sondern darauf hingewiesen, dass der Sitz nicht gebucht wurde //Anmerkung: Aktuell wird nicht abgefragt, ob der User wenn dieser "ausversehen" einen bereits gebuchten //markiert, die ganze Buchung zurückziehen will | D.h. wenn jemand z.B. vier Plätze nebeneinander bucht und einer davon war bereits gebucht //werden die anderen 3 Plätze gebucht und die 4. darf sich woanders einen Platz suchen if (aktiverSaal.istFrei(reihe, spalte)) { aktiverSaal.buchen(out ErrorCode, reihe, spalte); int platzNr = aktiverSaal.berechnePlatzNr(reihe, spalte); MessageBox.Show(platzNr.ToString()); buttons[reihe, spalte].BackColor = Color.MediumVioletRed; aktiverSaal.markiereSitz(reihe, spalte); } else { int platzNr = aktiverSaal.berechnePlatzNr(reihe, spalte); MessageBox.Show(platzNr.ToString() + " konnte nicht gebucht werden: \n Platz schon belegt!"); buttons[reihe, spalte].BackColor = Color.MediumVioletRed; aktiverSaal.markiereSitz(reihe, spalte); } } } } //Eventuell hier Bestellnummerkorelation bauen -> Bestellnummerfile wird mitgegeben und bei jeder Buchung um eins erhöht, //zu jeder Nummer werden Reihe und Spalte gespeichert sodass Kunde wenn er Bestellnummer eintippt sieht, welche Plätze er gebucht hat //Eventuell mit seperater anzeige auf dem Buttonfeld (Buttons in Lila, Orange oder Schwarz etc) } else ErrorCode = 11; //Fehlerhandling checkErrors(ErrorCode); } //Fehlerhandling private bool checkErrors (int ErrorCode) { switch (ErrorCode) { //Fehlermeldung je nach Fehlercode // 1 = ungültige Reihenanzahl case 1: MessageBox.Show("Ungültige Anzahl Reihen. Maximale Größe ist 1 - 9."); break; // 2 = ungültige Sitzanzahl case 2: MessageBox.Show("Ungültige Anzahl Sitze. Maximale Größe ist 1 - 30."); break; // 3 = Buchung von Sitzplatz x nicht möglich case 3: MessageBox.Show("Einer oder mehrere der gewünschten Plätze ist belegt. Buchen nicht möglich."); break; // 5 = Laden ist Fehlgeschlagen case 5: MessageBox.Show("Laden des Saals ist Fehlgeschlagen."); break; // 6 = Laden war erfolgreich case 6: MessageBox.Show("Laden des Saals war erfolgreich."); ErrorCode = 0; break; // 7 = Laden ist Fehlgeschlagen - Datei nicht gefunden case 7: MessageBox.Show("Laden Fehlgeschlagen - Saal nicht gefunden."); break; // 8 = Speichern ist Fehlgeschlagen case 8: MessageBox.Show("Speichern Fehlgeschlagen."); break; // 9 = Speichern war Erfolgreich case 9: MessageBox.Show("Speichern war Erfolgreich."); ErrorCode = 0; break; // 10 = Ungültige Eingabe case 10: MessageBox.Show("Ungültige oder Fehlende Eingabe von Name/Reihen/Sitze."); break; // 11 = Saal noch nicht erstellt case 11: MessageBox.Show("Kein Saal aktiv - Buchen nicht möglich."); break; // 0 = alles in ordnung default: break; } if (ErrorCode != 0) return false; else return true; } } }