ASP-Seiten generieren

Maxii

Mitglied
Ich hab folgendes Problem:

Ich schreib gereade meine Diplomarbeit und muss dabei aus einer MSSQL-DB belibig viele Daten auslese. Das ist weiters nicht so schwer. Das Problem jedoch ist, dass für jeden Datensatz 1 Button (inkl. Code dahinter) generiert werden soll.
Ich verwende übrigens C#!
wie mach ich das am besten?
MfG
 
Ich hab jetzt eine aspx und eine cs datei generiert, jetzt versteh ich aber nicht, warum es nicht .
Es existieren jetzt also folgende 2 Dateien:

WebForm1.aspx:

<%@ Page language="c#" Codebehind="WebForm1.cs" AutoEventWireup="false" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>Test</title>
<meta name="GENERATOR" Content="GRUBER/MAYER/PRENNER">
<meta name="CODE_LANGUAGE" Content="C#">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<!--STARTDEFINITIONS-->
<asp:Button id="Button1" BorderStyle="None" BackColor="#0000ff" BorderWidth="1" style="Z-INDEX: 101; LEFT: 80px; POSITION: absolute; TOP: 100px" runat="server" Text="bUtToN" Width="80px" Height="20px"></asp:Button>
<asp:Button id="Button2" BorderStyle="Solid" BackColor="#00ff00" BorderWidth="1" style="Z-INDEX: 101; LEFT: 80px; POSITION: absolute; TOP: 70px" runat="server" Text="Markus" Width="90px" Height="25px"></asp:Button>
<!--ENDDEFINITIONS-->
</form>
</body>
</HTML>

WebForm1.cs:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;

namespace Dummy
{
public class WebForm1 : System.Web.UI.Page
{
//[STARTDEFINITIONS]
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.Button Button2;
//[ENDDEFINITIONS]
private void Page_Load(object sender, System.EventArgs e)
{

}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}

private void InitializeComponent()
{
//[STARTEVENTHANDLER]
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Button2.Click += new System.EventHandler(this.Button2_Click);
//[ENDEVENTHANDLER]
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
//[STARTMETHODS]
private void Button1_Click(object sender, System.EventArgs e)
{
Button1.Visible = false;
}

private void Button2_Click(object sender, System.EventArgs e)
{
Button2.Visible = false;
}

//[ENDMETHODS]
}
}
 
Das kommt jetzt ganz darauf an was die funktion der buttons tun soll, wenn jeder Button beim Click dieselbe funktion aufrufen kann, allerdings selbstverständlich mit verschiedenen parametern, dann wäre dies möglich, habe ich auch schon gemacht, müsste aber erst wieder schauen wie das genau wenn du es so willst. Sollten es pro Button eine Funktion sein habe ich keine ahnung ob das funktioniert da du den neu generierten code ja im Prinzip erst noch nachkompilieren müsstest um ihn verwenden zu können.

Gruss MSuter
 
Hab kurz nachgesehen, vielleich hilft dir folgendes Codebeispiel weiter:


.ASPX-Code:

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="cSharpWebTest.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:placeHolder Runat="server" ID="plcButtons" />
</form>
</body>
</HTML>



.ASPX.CS-Code:

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace cSharpWebTest
{
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.PlaceHolder plcButtons;

private void Page_Load(object sender, System.EventArgs e)
{
for(int i = 1; i<=10;i++)
{
Button btnDynamic = new Button();
btnDynamic.Attributes.Add("Number",i.ToString());
btnDynamic.Click += new EventHandler(btnDynamic_Click);
btnDynamic.Text = "Button" + i.ToString("00");
plcButtons.Controls.Add(new LiteralControl("<br>Dynamisch erstellter Button " + i.ToString("00") + ": "));
plcButtons.Controls.Add(btnDynamic);
}
}

private void btnDynamic_Click(object sender, System.EventArgs e)
{
Button btnDynamic = (Button)sender;
Response.Write("Button" + btnDynamic.Attributes["Number"] + " wurde geklickt");
btnDynamic.Visible = false;

}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: Dieser Aufruf ist für den ASP.NET Web Form-Designer erforderlich.
//
InitializeComponent();
base.OnInit(e);
}


private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
}
}
 
Nach dem Klick auf den Button soll eine Anfrage an die Datenbank gestellt werden. Mit den zurück gegebenen daten wird eine datei erzeugt, mit der anzahl an buttons wie einträge in der Tabelle der Datenbank - kompliziert was?
Sprich: wenn die Tabelle zB. 92 einträge hat, dann soll eine ASPX-Seite generiert werden, mit 92 Buttons, wobei die Benennung der Einzelnen Buttons von den Einträgen in der DB abhängt.
Diese Buttons wiederum generieren ein ASPX-Document mit ....
Danke!
Mfg
 
Beinahe unmöglich

Wie bereits erwähnt kannst du theoretisch keine APSX Seiten dynamisch generieren (oder zumindest die Codebehinde Dateien nicht), da diese kompiliert werden. Diese müsstest du also nach dem dynamischen erstellen auch noch gleich kompilieren. Ist zwar wie ich gelesen habe irgendwie möglich, aber enorm kompliziert und gibt Seitenweise Code zu schreiben.
So wie du es beschreibst, sollte es allerdings auf die weise gehen wie ich es im Codebeispiel vorhin gezeigt habe. Dort erstelle ich auch Dynamisch Buttons mit einer Schleife (du müsstest dazu halt eine While-Schleife verwenden welche jeden Datensatz durcharbeitet). Wie du die Buttons Dynamisch bennenen und ihnen Events zuweisen kannst siehst du ebenfalls oben im Codebeispiel, ebenso wie die implementierung auf die ASPX-Seite. So wie ich deine Problembeschreibung lese, müsste es theoretisch so machbnar sein

Gruss MSuter
 
Hallo.

Irgendwie sehe ich ds Problem nicht so ganz, beziehungsweise finde ich hast du dich nicht ganz klar ausgedrückt Maxii.

Zum Beispiel was meinst du mit "wird eine datei erzeugt". Meinst du damit es soll eine neue Datei am Server erstellt werden, oder ein neues dynamisches HTML Dokument welches nur an den Server geschickt wird?

MSuter hat dir eigentlich ja schon ein ganz nettes Beispiel geschrieben mit dynamisch generierten Buttons mit EventHandler.

Habe dir nun auch ein kleines Beispiel erstellt, eventuell ist dir dieses passender.
Online zum Ansehen

default.aspx
Code:
<%@ Page language="c#" Codebehind="default.aspx.cs" AutoEventWireup="false" Inherits="TutsDE_Maxii.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
	<HEAD>
		<title>WebForm1</title>
		<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
		<meta name="CODE_LANGUAGE" Content="C#">
		<meta name="vs_defaultClientScript" content="JavaScript">
		<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
	</HEAD>
	<body MS_POSITIONING="GridLayout">
		<form id="Form1" method="post" runat="server">
			
			<asp:PlaceHolder runat="server" ID="phButtons"></asp:PlaceHolder><br><br>
			<asp:PlaceHolder runat="server" ID="phDataSet"></asp:PlaceHolder>
		
		</form>
	</body>
</HTML>

default.aspx.cs - Code Behind (unvollständig)
Code:
private void DoStuff()
		{
			DataSet ds = new DataSet();
			ds.ReadXmlSchema(Server.MapPath("data.xsd"));
			ds.ReadXml(Server.MapPath("testdaten.xml"));

			foreach (DataRow dr in ds.Tables[0].Rows)
			{
				Button btnDE = new Button();
				btnDE.Text = (string) dr["Name"];
				btnDE.ID = "btn" + (int)dr["ID"];
				btnDE.Attributes.Add("dsID", ((int)dr["ID"]).ToString());
				btnDE.Click += new EventHandler(this.ButtonClicked);
				phButtons.Controls.Add(btnDE);
			}
		}

		public void ButtonClicked(object sender, EventArgs ea)
		{
			Button btn = (Button) sender;
			int ID = Convert.ToInt16(btn.Attributes["dsID"]);
			
			DataSet ds = new DataSet();
			ds.ReadXmlSchema(Server.MapPath("data.xsd"));
			ds.ReadXml(Server.MapPath("testdaten.xml"));

			DataRow[] arrDR = ds.Tables[0].Select("ID = " + ID);

			if (arrDR.Length == 1)
			{
				Label lbl = new Label();
				lbl.ID = "lbl" + ID;
				lbl.Text = (string) arrDR[0]["Beschreibung"];
				phDataSet.Controls.Add(lbl);
			}
			
		}

Das ganze Projekt ist auch angehängt als rar Datei. ;)

Mfg,
Alex
 

Anhänge

  • tutsde_maxii.rar
    6,6 KB · Aufrufe: 20
Ich glaube, das letzte tut. mit den 99 Buttons hat mir am meisten geholfen.
ich danke recht herzlich! wünsch auch noch allen hier im Forum gesegnete und
frohe Weihnachten!
MfG
Maxii
 
Zurück