private void ZutatenSpeichern(Rezept rezept, Panel rezeptAbteilungPanel, Rezeptabteilung rezeptAbteilung)
        {
            var zutatCtrlList = new List<TextBox>();
            var mengeCtrlList = new List<TextBox>();
            var einheitCtrlList = new List<DropDownList>();

            //Control Listen erstellen
            foreach (Control control in rezeptAbteilungPanel.Controls)
            {
                if (control.ID != null)
                {
                    if (control.ID.Contains(Helper.REZEPBEARBEITEN_IDENT_EINHEIT))
                        einheitCtrlList.Add((DropDownList)control);
                    else if (control.ID.Contains(Helper.REZEPBEARBEITEN_IDENT_MENGE))
                        mengeCtrlList.Add((TextBox)control);
                    else if (control.ID.Contains(Helper.REZEPBEARBEITEN_IDENT_ZUTAT))
                        zutatCtrlList.Add((TextBox)control);
                }
            }

            //Set RezeptAbteilung for existing Zutaten that have no RezeptAbteilung assigned, yet
            if(rezeptAbteilung != null && rezeptAbteilung.ID == 0 && zutatCtrlList.Count(d => !d.ID.Contains(Helper.REZEPBEARBEITEN_IDENT_NEU)) > 0)
                rezept.RezeptZutats.Select(d => { if (d.RezeptabteilungID == null) { d.Rezeptabteilung = rezeptAbteilung; } return d; }).ToList();

            //Ggf. neue Zutat einfügen
            NeueZutatenEinfügen(rezept, zutatCtrlList, mengeCtrlList, einheitCtrlList, rezeptAbteilung);

            //Zutaten aktualisieren
            this.BestehendeZutatenAktualisieren(rezept, zutatCtrlList, mengeCtrlList, einheitCtrlList);
        }
        private void RezeptAbteilungenSpeichern(Rezept rezept, rherzog_70515_rzvwContext db)
        {
            //split up
            var rezeptAbteilungPanelExisting = new List<Panel>();
            var rezeptAbteilungPanelNew = new List<Panel>();

            foreach (Control control in UpdatePanelZutaten.ContentTemplateContainer.Controls)
            {
                if (control.ID != null)
                {
                    if(control.ID.Contains(Helper.REZEPBEARBEITEN_IDENT_REZEPABTEILUNG_PANEL + Helper.REZEPBEARBEITEN_IDENT_NEU))
                        rezeptAbteilungPanelNew.Add((Panel)control);
                    else if(control.ID.Contains(Helper.REZEPBEARBEITEN_IDENT_REZEPABTEILUNG_PANEL))
                        rezeptAbteilungPanelExisting.Add((Panel)control);
                }
            }

            //existing Rezeptabteilungen: Save changes in Zutaten and Rezeptabteilung
            foreach (var rezeptAbteilungPanel in rezeptAbteilungPanelExisting)
            {
                var rezeptAbteilung = RezeptabteilungSpeichern(rezept, rezeptAbteilungPanel, db);
                ZutatenSpeichern(rezept, rezeptAbteilungPanel, rezeptAbteilung);
            }

            //for new Rezeptabteilungen:
            foreach (var rezeptAbteilungPanel in rezeptAbteilungPanelNew)
            {
                var rezeptAbteilung = RezeptabteilungSpeichern(rezept, rezeptAbteilungPanel, db);
                ZutatenSpeichern(rezept, rezeptAbteilungPanel, rezeptAbteilung);
            }
        }
        private Rezeptabteilung RezeptabteilungSpeichern(Rezept rezept, Panel rezeptAbteilungPanel, rherzog_70515_rzvwContext db)
        {
            var rezeptAbteilungID = Helper.FindIdOnDynamicControl(rezeptAbteilungPanel);
            Rezeptabteilung rezeptAbteilung = null;

            //Create Rezeptabteilung
            var rezeptAbteilungTextbox = (TextBox)Helper.FindControl(rezeptAbteilungPanel, Helper.REZEPBEARBEITEN_IDENT_REZEPABTEILUNG + Helper.REZEPBEARBEITEN_IDENT_NEU);
            if (rezeptAbteilungID == null && rezeptAbteilungTextbox != null && rezeptAbteilungTextbox.Text != String.Empty)
            {
                rezeptAbteilung = new Rezeptabteilung { Name = rezeptAbteilungTextbox.Text };
            }

            //Rename existing Rezeptabteilung
            rezeptAbteilungTextbox = (TextBox)Helper.FindControl(rezeptAbteilungPanel, Helper.REZEPBEARBEITEN_IDENT_REZEPABTEILUNG);
            if (rezeptAbteilungID != null && rezeptAbteilungTextbox != null)
            {
                rezeptAbteilung = db.Rezeptabteilungs.First(d => d.ID == rezeptAbteilungID);
                rezeptAbteilung.Name = rezeptAbteilungTextbox.Text;
            }

            return rezeptAbteilung;
        }
        private void NeueZutatenEinfügen(Rezept rezept, IEnumerable<TextBox> zutatCtrlList, IEnumerable<TextBox> mengeCtrlList, IEnumerable<DropDownList> einheitCtrlList, Rezeptabteilung rezeptAbteilung)
        {
            //Neue eingefügt Zutaten ermitteln
            var zutatCtrlListNew = zutatCtrlList.Where(d => d.ID.Contains(Helper.REZEPBEARBEITEN_IDENT_NEU)).ToList();
            var mengeCtrlListNew = mengeCtrlList.Where(d => d.ID.Contains(Helper.REZEPBEARBEITEN_IDENT_NEU)).ToList();
            var einheitCtrlListNew = einheitCtrlList.Where(d => d.ID.Contains(Helper.REZEPBEARBEITEN_IDENT_NEU)).ToList();

            //wenn eine Eingabe erfolgt ist
            if (zutatCtrlListNew.Count != 0 && mengeCtrlListNew.Count != 0)
            {
                //jede neue Zutat dem Rezept hinzufügen
                foreach (var zutatCtrlNew in zutatCtrlListNew)
                {
                    NeueZutatEinfügen(rezept, zutatCtrlNew, einheitCtrlListNew, mengeCtrlListNew, rezeptAbteilung);
                }
            }
        }
        private void PreparePageForEditingExistingOrCreatingNewRezept()
        {
            using (var db = new rherzog_70515_rzvwContext()) //TODO: Create Property for DB connection. Page Lifecycle events could be helpful
            {
                this.SetEinheitAndKategorieDropDowns(db);

                if (!this.Page.IsPostBack && RezeptIdForEditing != 0)
                {
                    this.PreparePageForEditing();
                }
                else
                {
                    Rezept rezept;
                    if (RezeptIdForEditing != 0)
                    {
                        //prepare page for editing
                        rezept = db.Rezepts.First(d => d.ID == RezeptIdForEditing);
                        this.Literal_Überschrift.Text = "Rezept bearbeiten";
                        this.Button_abbrechen.Visible = true;
                    }
                    else
                    {
                        //prepare for adding new recipe
                        rezept = new Rezept();
                        this.Literal_Überschrift.Text = "Neues Rezept";
                        this.Button_abbrechen.Visible = false;
                        this.Button_löschen.Visible = false;
                    }

                    this.DisplayZutatenGroupedByRezeptabteilungen(db, rezept, false);
                }
            }
        }
        /// <summary>
        /// Displays all Zutaten including the Rezeptabteilung for that Rezept
        /// </summary>
        /// <param name="db"></param>
        /// <param name="rezept"></param>
        /// <param name="setValues"></param>
        private void DisplayZutatenGroupedByRezeptabteilungen(rherzog_70515_rzvwContext db, Rezept rezept, bool setValues)
        {
            var zutatenOhneRezeptAbteilung = rezept.RezeptZutats.Where(d => d.RezeptabteilungID == null).ToList();
            var zutatenNachRezeptAbteilung = rezept.RezeptZutats.GroupBy(d => d.Rezeptabteilung).Where(d => d.Key != null).OrderBy(d => d.Key.Name).ToList();

            //Zutaten mit Rezeptabteilung anzeigen
            var zutatenNachRezeptAbteilungList = zutatenNachRezeptAbteilung.ToList();
            for (int i = 1; i <= zutatenNachRezeptAbteilungList.Count(); i++)
            {
                this.DisplaySingleRezeptabteilung(db, zutatenNachRezeptAbteilungList[i-1].Key.RezeptZutats, setValues, i);
            }

            //Zutaten ohne Rezeptabteilung anzeigen
            this.DisplaySingleRezeptabteilung(db, zutatenOhneRezeptAbteilung, setValues, -1);

            //Neue Rezeptabteilungen anzeigen
            for (int i = 1; i <= ViewStateRezeptAbteilungPanelAnzahl; i++)
            {
                DisplaySingleRezeptabteilungNeu(i);
            }
        }
        private void BestehendeZutatenAktualisieren(Rezept rezept, IEnumerable<TextBox> zutatCtrlList, List<TextBox> mengeCtrlList, List<DropDownList> einheitCtrlList)
        {
            foreach (var zutatCtrl in zutatCtrlList)
            {
                int? idFound = Helper.FindIdOnDynamicControl(zutatCtrl);
                if (idFound != null)
                {
                    var zutat = rezept.RezeptZutats.First(d => d.ZutatID == idFound).Zutat;
                    var rezZutat = rezept.RezeptZutats.First(d => d.ZutatID == idFound);

                    //Zutat Name
                    zutat.Name = zutatCtrl.Text;

                    //Zutat Menge
                    var mengeCtrl = this.GetMengeTextbox(idFound, mengeCtrlList);
                    //Bruchzahlen umwandeln
                    if (!String.IsNullOrEmpty(mengeCtrl.Text))
                    {
                        rezZutat.Menge = mengeCtrl.Text;
                    }
                    else
                    {
                        rezZutat.MengeVon = null;
                        rezZutat.MengeBis = null;
                    }

                    //Zutat Einheit
                    var einheitCtrl = this.GetEinheitDropDownList(idFound, einheitCtrlList);

                    if (einheitCtrl != null)
                    {
                        if (string.IsNullOrEmpty(einheitCtrl.SelectedItem.Value))
                        {
                            rezZutat.EinheitID = null;
                        }
                        else
                        {
                            rezZutat.EinheitID = Int32.Parse(einheitCtrl.SelectedItem.Value);
                        }
                    }
                }
            }
        }
        private static void NeueZutatEinfügen(Rezept rezept, TextBox zutatCtrlNew, IEnumerable<DropDownList> einheitCtrlListNew, IEnumerable<TextBox> mengeCtrlListNew, Rezeptabteilung rezeptAbteilung)
        {
            var idNummer = Helper.FindIdOnDynamicNewControl(zutatCtrlNew);
            //zugeh. Einheit suchen
            var einheitCtrlNew = einheitCtrlListNew.First(d => d.ID.Contains(""+idNummer));

            //zugeh. Menge suchen
            var mengeCtrlNew = mengeCtrlListNew.First(d => d.ID.Contains(""+idNummer));
            if (!string.IsNullOrEmpty(zutatCtrlNew.Text))
            {
                var rezZutat = new RezeptZutat { Menge = mengeCtrlNew.Text, Rezeptabteilung = rezeptAbteilung };
                var zutat = new Zutat {Name = zutatCtrlNew.Text};
                rezZutat.Zutat = zutat;
                if(einheitCtrlNew.SelectedIndex != 0)
                    rezZutat.EinheitID = Int32.Parse(einheitCtrlNew.SelectedItem.Value);
                rezept.RezeptZutats.Add(rezZutat);
            }
        }
        protected void ButtonSpeichernClick(object sender, EventArgs e)
        {
            using (var db = new rherzog_70515_rzvwContext())
            {
                //Rezept bearbeiten
                Rezept rezept;
                if (RezeptIdForEditing != 0)
                {
                    //DB Abfrage
                    rezept = db.Rezepts.FirstOrDefault(d => d.ID == RezeptIdForEditing);
                }
                //Neu einfügen
                else
                {
                    rezept = new Rezept();
                    db.Rezepts.Add(rezept);
                }

                if(rezept == null) return;
                //Textboxen
                rezept.Anleitung = TextBox_Anleitung.Text;
                rezept.Menge = TextBox_Menge.Text;
                rezept.Name = TextBox_Rezept.Text;

                //Bild speichern
                var bild = (byte[])Session[RezeptBild];
                if (bild != null)
                {
                    rezept.Bild = bild;
                }
                Session.Remove(RezeptBild);

                //Einheit speichern
                rezept.EinheitID = Int32.Parse(DropDownList_AnzahlEinheit.SelectedItem.Value);

                //Kategorie speichern
                rezept.KategorieID = Int32.Parse(DropDownList_Kategorie.SelectedItem.Value);

                //Rezeptabteilungen speichern
                this.RezeptAbteilungenSpeichern(rezept, db);

                db.SaveChanges();

                //Page refresh
                //Nach Neuerfassung Editieren
                if (RezeptIdForEditing != 0)
                    Response.Redirect(Request.Url.ToString());
                else
                    Response.Redirect(this.Request.Url + "?RezeptID=" + rezept.ID);
            }
        }
        private void SeiteBefüllenRezeptabteilungen(Rezept rezept)
        {
            var zutatenNachRezeptAbteilung = rezept.RezeptZutats.GroupBy(d => d.Rezeptabteilung).Where(d => d.Key != null).OrderBy(d => d.Key.Name).ToList();
            var zutatenOhneRezeptAbteilung = rezept.RezeptZutats.Where(d => d.RezeptabteilungID == null).ToList();

            //Zutaten mit Rezeptabteilung anzeigen
            var zutatenNachRezeptAbteilungList = zutatenNachRezeptAbteilung.ToList();
            for (int i = 1; i <= zutatenNachRezeptAbteilungList.Count(); i++)
            {
                this.DisplaySingleRezeptabteilung(zutatenNachRezeptAbteilungList[i - 1].Key.RezeptZutats);
            }

            //Zutaten ohne Rezeptabteilung anzeigen
            this.DisplaySingleRezeptabteilung(zutatenOhneRezeptAbteilung);
        }