ASP.NET Dynamische Controls Event-Problem (c#)
-
Hallo, ich habe momentan ein Problem mit einem ASP.NET Projekt, das zum generieren eines Newsletters dienen soll (beliebig viele Artikel), und zwar füge ich zur Laufzeit Controls hinzu (DopDownLists), definiere die Eigenschaften und setze eine Event-Funktion. Diese Event-Funktion wird jedoch nie ausgeführt, obwohl es einen Page-Reload gibt. Bin wircklich ratlos und bin für jeden Vorschlag dankbar. (Bin ASP.NET Neuling)
Anbei mein momentaner Stand
.cs
using System; using System.Collections.Generic; using System.Collections; using System.Configuration; using System.Data.SqlClient; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Data.SqlTypes; namespace NewsletterGen { public partial class _Default : System.Web.UI.Page { //todo pfad relativ angeben private string uploadPath = @"D:\inetpub\wwwroot\jufi\Uploads\"; private Hashtable produktIDs = new Hashtable(); private ArrayList artikel = new ArrayList(); private ArrayList hersteller = new ArrayList(); private Hashtable imagePaths = new Hashtable(); private static List<DropDownList> dropDownsHerstellerList = new List<DropDownList>(); private static List<DropDownList> dropDownsArtikelList = new List<DropDownList>(); private static List<Label> artikelPreisList = new List<Label>(); private static List<Image> imageArtikelList = new List<Image>(); private static List<HtmlGenericControl> productAreaList = new List<HtmlGenericControl>(); private static List<TextBox> artikelBeschreibungList = new List<TextBox>(); private static int multiplikatorArea = 3; private static int i = 0; private static int multiplikatorButton = 2; protected void Page_Load(object sender, EventArgs e) { } protected void Page_Init(object sender, EventArgs e) { initImagePaths(); initDropDownLists(); initProduktIDs(); } protected override void CreateChildControls() { if (productAreaList.Count > 0) { for (int j = 0; j < productAreaList.Count; j++) { this.form1.Controls.Add(productAreaList[j]); this.form1.Controls.Add(imageArtikelList[j]); } } } public void initDropDownLists() { SqlConnection sqlConnection = new SqlConnection("Data Source=localhost;Integrated Security=SSPI; server=SDYEATEST01; Database=jufi_db"); sqlConnection.Open(); SqlCommand Sqlcommand = new SqlCommand("", sqlConnection); SqlDataReader dataReader; Sqlcommand.CommandText = "SELECT Tbl_Top10Newsletter.produkt, Tbl_Top10Newsletter.hersteller FROM Tbl_Top10Newsletter"; dataReader = Sqlcommand.ExecuteReader(); while (dataReader.Read()) { hersteller.Add(dropDownArtikel.DataSource = dataReader.GetString(1)); artikel.Add(dropDownHersteller.DataSource = dataReader.GetString(0)); } dropDownArtikel.DataSource = artikel; dropDownArtikel.DataBind(); dropDownHersteller.DataSource = hersteller; dropDownHersteller.DataBind(); dataReader.Close(); sqlConnection.Close(); } public void initProduktIDs() { SqlConnection connection = new SqlConnection("Data Source=localhost;Integrated Security=SSPI; server=SDYEATEST01; Database=jufi_db"); connection.Open(); SqlCommand command = new SqlCommand("", connection); SqlDataReader reader; for (int i = 0; i < this.artikel.Count; i++) { command.CommandText = "SELECT Tbl_Produkt.id_Produkt FROM Tbl_Produkt WHERE Tbl_Produkt.Name = '" + this.artikel[i] +"'"; reader = command.ExecuteReader(); while (reader.Read()) { this.produktIDs.Add(this.artikel[i], reader.GetInt32(0)); } reader.Close(); } connection.Close(); } public void initImagePaths() { SqlConnection sqlConnection = new SqlConnection("Data Source=localhost;Integrated Security=SSPI; server=SDYEATEST01; Database=jufi_db"); SqlConnection sqlConnection2 = new SqlConnection("Data Source=localhost;Integrated Security=SSPI; server=SDYEATEST01; Database=jufi_db"); sqlConnection2.Open(); sqlConnection.Open(); SqlCommand sqlCommand = new SqlCommand("", sqlConnection); SqlCommand sqlCommand2 = new SqlCommand("", sqlConnection2); SqlDataReader dataReader; SqlDataReader imagesReader; sqlCommand.CommandText = "SELECT Tbl_Top10Newsletter.produkt FROM Tbl_Top10Newsletter"; dataReader = sqlCommand.ExecuteReader(); while (dataReader.Read()) { sqlCommand2.CommandText = "SELECT Imagepfad FROM Tbl_Produkt WHERE Tbl_Produkt.Name = '" + dataReader.GetString(0) + "'"; imagesReader = sqlCommand2.ExecuteReader(); if (imagesReader.HasRows == false) { break; } while (imagesReader.Read()) { imagePaths.Add(dataReader.GetString(0), imagesReader.GetString(0)); } imagesReader.Close(); } dataReader.Close(); sqlConnection.Close(); } //Eventhandler Funktionen=================================================================================================================================================== public void ImportTop10Products(object sender, EventArgs e) { if (uploadArea.HasFile) { uploadArea.SaveAs(this.uploadPath + uploadArea.FileName); Import import = new Import(this.uploadPath + uploadArea.FileName); if (import.CheckFile(".csv")) { import.SaveUpload(); } else { error("Datei ist keine .csv-Datei"); } } } //Lesen des Bildes, sowie des Herstellers zu einem Artikel aus der Datenbank, sowie setzen der Control-Werte auf diese public void artikelChanged(object sender, EventArgs e) { SqlConnection connection = new SqlConnection("Data Source=localhost;Integrated Security=SSPI; server=SDYEATEST01; Database=jufi_db"); connection.Open(); SqlDataReader reader; SqlCommand command = new SqlCommand("SELECT Tbl_Verkaufspreis.Verkaufspreis FROM Tbl_Verkaufspreis WHERE Tbl_Verkaufspreis.Tbl_Produkt_id_Produkt = " + this.produktIDs[dropDownArtikel.SelectedValue], connection); try { reader = command.ExecuteReader(); while (reader.Read()) { labelArtikelPreis.Text = "Preis: " + Convert.ToString(reader.GetDecimal(0)) + " €"; } reader.Close(); connection.Close(); } catch(Exception ex) { labelFehler.Text = ex.Message; } SqlConnection connection2 = new SqlConnection("Data Source=localhost;Integrated Security=SSPI; server=SDYEATEST01; Database=jufi_db"); connection2.Open(); SqlDataReader getHersteller; SqlCommand command2 = new SqlCommand("SELECT hersteller FROM Tbl_Top10Newsletter WHERE produkt = '" + dropDownArtikel.SelectedValue + "'", connection2); getHersteller = command2.ExecuteReader(); while (getHersteller.Read()) { dropDownHersteller.SelectedValue = Convert.ToString(getHersteller.GetString(0)); } getHersteller.Close(); connection2.Close(); //todo pfad relativ angeben imageArtikel.ImageUrl = "Uploads/" + imagePaths[dropDownArtikel.SelectedValue]; } //Das Kopflogo für den Newsletter speichern (vorhandene Logos werden überschrieben) public void ImportKopfLogo(object sender, EventArgs e) { if (uploadAreaKopfLogo.HasFile) { uploadAreaKopfLogo.SaveAs(this.uploadPath + "newsletterKopfLogo" + ".jpg"); Import import = new Import(this.uploadPath + "newsletterKopfLogo" + ".jpg"); if (!import.CheckFile(".jpg")) { error("Datei ist keine .jpg-Datei"); } } } //Die Controls für die Eingabe des Lagerverkauftextes sichtbar schalten bzw unsichtbar public void lagerverkaufChecked(object sender, EventArgs e) { if (textBoxArtikelBeschreibung.Visible && labelBeschreibungLagerverkauf.Visible) { textBoxArtikelBeschreibung.Visible = false; labelBeschreibungLagerverkauf.Visible = false; } else { textBoxArtikelBeschreibung.Visible = true; labelBeschreibungLagerverkauf.Visible = true; } } //Vorschau des generierten HTML/CSS-Codes in einem Popup Anzeigen public void createVorschau(object sender, EventArgs e) { //Controls auslesen und in die HTML/CSS-Vorlage einbinden } public void NextArtikel(object sender, EventArgs e) { productAreaList.Add(new HtmlGenericControl("div")); int anzahl = productAreaList.Count; productAreaList[i].ID = "productArea" + i; productAreaList[i].Attributes.Add("style", "position:absolute;width:400px;height:200px;border:2px solid black;top:" + (280 * multiplikatorArea) + "px;left:10px; margin:10px 10px 10px 10px; padding:10px 30px 0px 30px;"); dropDownsHerstellerList.Add(new DropDownList()); dropDownsHerstellerList[i].Attributes.Add("runat", "server"); dropDownsHerstellerList[i].Width = 144; dropDownsHerstellerList[i].Height = 28; dropDownsHerstellerList[i].Enabled = false; dropDownsHerstellerList[i].ID = "dropDownHersteller" + i; dropDownsHerstellerList[i].DataSource = hersteller; dropDownsHerstellerList[i].DataBind(); dropDownsArtikelList.Add(new DropDownList()); dropDownsArtikelList[i].Attributes.Add("runat", "server"); dropDownsArtikelList[i].AutoPostBack = true; dropDownsArtikelList[i].Width = 158; dropDownsArtikelList[i].Height = 28; dropDownsArtikelList[i].DataSource = artikel; dropDownsArtikelList[i].DataBind(); dropDownsArtikelList[i].SelectedIndexChanged += new EventHandler(artikelChanged); artikelPreisList.Add(new Label()); artikelPreisList[i].Text = "Preis:"; artikelPreisList[i].Attributes.Add("runat", "server"); artikelPreisList[i].ID = "labelArtikelPreis" + i; HtmlGenericControl br1 = new HtmlGenericControl("br"); Label lbl1 = new Label(); lbl1.Text = "Artikel-Beschreibung eingeben:"; lbl1.Width = 300; lbl1.Attributes.Add("runat", "server"); lbl1.Attributes.Add("style", "margin-top:10px;"); artikelBeschreibungList.Add(new TextBox()); artikelBeschreibungList[i].Attributes.Add("runat", "server"); artikelBeschreibungList[i].Height = 100; artikelBeschreibungList[i].Width = 300; artikelBeschreibungList[i].TextMode = TextBoxMode.MultiLine; artikelBeschreibungList[i].Attributes.Add("style", "margin-top:10px;"); productAreaList[i].Controls.Add(dropDownsHerstellerList[i]); productAreaList[i].Controls.Add(dropDownsArtikelList[i]); productAreaList[i].Controls.Add(artikelPreisList[i]); productAreaList[i].Controls.Add(br1); productAreaList[i].Controls.Add(lbl1); productAreaList[i].Controls.Add(artikelBeschreibungList[i]); form1.Controls.Add(productAreaList[i]); imageArtikelList.Add(new Image()); imageArtikelList[i].ID = "imageArtikel" + i; imageArtikelList[i].Attributes.Add("runat", "server"); imageArtikelList[i].Width = 400; imageArtikelList[i].Height = 400; imageArtikelList[i].ImageUrl = "noImage.jpg"; imageArtikelList[i].Attributes.Add("style", "position:absolute;left:600px;top:" + (240 * multiplikatorArea) + "px;"); form1.Controls.Add(imageArtikelList[i]); buttonNextArtikel.Attributes.Add("style", "font-size:40px; width:100px; position:absolute; top:" + (550 * multiplikatorButton) + "px; left:20px;"); buttonVorschau.Attributes.Add("style", "width:100px; position:absolute; left:150px; top:" + (550 * multiplikatorButton) + "px; height:54px;"); i++; multiplikatorArea += 3; multiplikatorButton += 2; } //Fehlermeldungen Anzeiegn public void error(string text) { uploadArea.Visible = false; uploadButtonTop10Products.Visible = false; buttonVorschau.Visible = false; dropDownArtikel.Visible = false; dropDownHersteller.Visible = false; textBoxArtikelBeschreibung.Visible = false; imageArtikel.Visible = false; labelFehler.Visible = true; labelFehler.Text = text; checkBoxLagerverkauf.Visible = false; } } }
.asp
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Newsletter.aspx.cs" Inherits="NewsletterGen._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Newsletter-Generator</title> <style type="text/css"> .uploadArea { width:400px; height:100px; border: 2px solid black; margin:10px 10px 10px 10px; padding:30px 30px 5px 30px; } #uploadAreaTop10 { position:absolute; } #uploadAreaHeadLogo { position:absolute; left:500px; } #productArea { position:absolute; width:400px; height:200px; border:2px solid black; top:280px; left:10px; margin:10px 10px 10px 10px; padding:10px 30px 0px 30px; } #textBoxArtikelBeschreibung { position:absolute; left:800px; top:500px; } #imageArtikel { position:absolute; left:600px; top:220px; } #artikelBeschreibung { margin-top:10px; } #lagerverkaufArea { position:absolute; left:1000px; top:10px; border:2px solid black; width:500px; height:160px; margin:10px 10px 10px 10px; padding:10px 10px 10px 10px; } #textBoxArtikelBeschreibung { position:absolute; left:200px; top:50px; } </style> </head> <body> <form id="form1" runat="server"> <!-- Uploadbereich für die Produktauswahl --> <div id="uploadAreaTop10" class="uploadArea"> <asp:Label runat="server" Text="Produktauswahl hochladen:" style="margin:5px 5px 5px 5px;"></asp:Label> <asp:FileUpload runat="server" style="margin:5px 5px 5px 5px;" id="uploadArea" Visible="true" Height="22px" /> <asp:Button runat="server" id="uploadButtonTop10Products" OnClick="ImportTop10Products" Text="Upload" /> </div> <!-- Uploadbereich für das Kopflogo des Newsletter --> <div id="uploadAreaHeadLogo" class="uploadArea"> <asp:Label runat="server" style="margin:2px 2px 2px 2px;" id="uploadAreaImage" Visible="true" Height="22px" Text="Kopflogo hochladen:" /> <asp:FileUpload runat="server" style="margin:5px 5px 5px 5px;" id="uploadAreaKopfLogo" Visible="true" Height="22px" /> <asp:Button runat="server" id="uploadButtonKopfLogo" OnClick="ImportKopfLogo" Text="Upload" /> </div> <!-- Bereich für die Auswahl eines Produktes sowie des Beschreibungstextes --> <div id="productArea"> <asp:DropDownList runat="server" ID="dropDownHersteller" Width="144px" Height="28px" Enabled="false" ></asp:DropDownList> <asp:DropDownList runat="server" ID="dropDownArtikel" Width="158px" Height="28px" OnSelectedIndexChanged="artikelChanged" AutoPostBack="true" ></asp:DropDownList> <asp:Label ID="labelArtikelPreis" Text="Preis:" runat="server"></asp:Label><br /> <asp:Label Text="Artikel-Beschreibung eingeben: " Width="300px" runat="server" style="margin-top:10px;"></asp:Label> <asp:TextBox ID="artikelBeschreibung" runat="server" Height="100px" Width="300px" TextMode="MultiLine"></asp:TextBox> </div> <!-- Festlegen eines Textes falls ein Lagerverkauf stattfindet --> <div id="lagerverkaufArea"> <asp:CheckBox runat="server" AutoPostBack="true" ID="checkBoxLagerverkauf" OnCheckedChanged="lagerverkaufChecked"/> <asp:Label Text="Lagerverkauf" runat="server"></asp:Label> <asp:Label ID="labelBeschreibungLagerverkauf" Visible="false" Text="Beschreibung für den Lagerverkauf:" style="position:absolute; margin-left:80px;" runat="server"></asp:Label> <asp:TextBox Visible="false" ID="textBoxArtikelBeschreibung" runat="server" Height="108px" Width="278px" TextMode="MultiLine"></asp:TextBox> </div> <!-- Image Tag für das Bild zu dem ausgewähkten Produkt ---> <asp:Image ID="imageArtikel" ImageUrl="noImage.jpg" Width="400" Height="400" runat="server" /> <!-- Label für Fehlermeldungen der Anwendung --> <asp:Label ID="labelFehler" runat="server" Visible="false" Text="" ForeColor="Red"></asp:Label> <!-- Contentplaceholder für die Generierung des nächsten Artikels --> <asp:PlaceHolder runat="server" ID="NextArtikelPlaceHolder"> </asp:PlaceHolder> <asp:Button ID="buttonNextArtikel" OnClick="NextArtikel" runat="server" Visible="true" style="font-size:40px; width:100px; position:absolute; top:550px; left:20px;" Text="+" /> <asp:Button ID="buttonVorschau" Text="Vorschau" runat="server" style="width:100px; position:absolute; left:150px; top:550px; height:54px;" OnClick="createVorschau" /> </form> </body> </html>
Mit freundlichen Grüßen Anon
-
Hallo,
ich verstehe den Zusammenhang zwischen Code und Frage nicht
Ich Rate einfach mal ins blaue: Page_Reload wird vor dem Neuladen der Seite ausgeführt, nicht danach. Das erklärt warum DInge die im Reload ausgeführt werden, nach dem Reload nicht mehr sichtbar sind. Ob das nun deine Frage beantwort weiß ich allerdings nicht.LG
-
Nein die Darstellung ist nicht das Problem, sondern das die Ereigniss-Funktion nicht ausgeführt wird, die ich den erzeugten DDL's zugewiesen habe. Die Erzeugten Controls werden in Listen gespeichert die als static deklariert sind
und beim Page_Init eingebunden. Die Seite wird geladen, und wenn ich nun per Button DDL's erzeuge, werden diese in einer Liste gespeichert, dann folgt der Page-Reload. Die neue DDL wird angezeigt, ich ändere einen Eintrag in der DDL-Artikel, ein reload wird ausgeführt (OnSelectedIndexChnaged) jedoch wird das damit verknüpfte Ereigniss nicht ausgeführt, bin schon mit dem Debugger durchgegangen(Keine Warnungen oder Fehler)Mit freundlichen Grüßen Anon