You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

323 lines
14 KiB
C#

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;
}
}
}