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