Web-Anwendungen mit Web Forms programmieren - beim O'Reilly ...
Web-Anwendungen mit Web Forms programmieren - beim O'Reilly ...
Web-Anwendungen mit Web Forms programmieren - beim O'Reilly ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
First<br />
Kapitel 15<br />
KAPITEL 15<br />
<strong>Web</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong><br />
<strong>programmieren</strong><br />
Max.<br />
Linie<br />
Immer mehr Entwickler gehen dazu über, anstelle traditioneller Windows-Desktop-<br />
<strong>Anwendungen</strong> <strong>Web</strong>-basierte <strong>Anwendungen</strong> zu schreiben, sogar dann, wenn die Programme<br />
für den Desktop-Gebrauch bestimmt sind. Dies ist <strong>mit</strong> zahlreichen offensichtlichen<br />
Vorteilen verbunden. So muß man für die Benutzeroberfläche nur wenig<br />
implementieren und kann vieles dem Internet Explorer oder dem Netscape Navigator<br />
überlassen. Ein größerer Vorteil dürfte aber sein, daß die Verteilung von neuen Versionen<br />
schneller, einfacher und kostengünstiger ist. Als ich einmal an einem Online-Netzwerk<br />
arbeitete, einem Vorgänger des <strong>Web</strong>, schätzten wir die Verteilungskosten für jeden<br />
Upgrade auf eine Million Dollar pro Diskette (erinnern Sie sich noch an Disketten?).<br />
<strong>Web</strong>-<strong>Anwendungen</strong> haben dagegen praktisch gar keine Verteilungskosten. Der dritte<br />
Vorteil von <strong>Web</strong>-<strong>Anwendungen</strong> besteht in der verteilten Verarbeitung. Das <strong>Web</strong> bietet<br />
standardisierte Protokolle (z.B. HTTP, HTML und XML), die den Aufbau von n-Tier-<br />
<strong>Anwendungen</strong> erleichtern.<br />
Die .NET-Technologie für die Erstellung von <strong>Web</strong>-<strong>Anwendungen</strong> (und dynamischen<br />
<strong>Web</strong>sites) ist ASP.NET, das in seinen Namensräumen System.<strong>Web</strong> und System.<strong>Web</strong>.UI<br />
eine reichhaltige Auswahl von Typen für den Aufbau von <strong>Web</strong>-<strong>Anwendungen</strong> bietet. In<br />
diesem Kapitel liegt der Fokus auf dem Schnittpunkt von ASP.NET und C#-Programmierung:<br />
auf der Entwicklung <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong>. (Über ASP.NET als solches erfahren Sie<br />
mehr in meinem Buch Programming ASP.NET, O’Reilly 2002.)<br />
<strong>Web</strong> <strong>Forms</strong> ermöglichen es, Techniken des Rapid Application Development (RAD) bei<br />
der Entwicklung von <strong>Web</strong>-<strong>Anwendungen</strong> einzusetzen (vergleichbar <strong>mit</strong> denen, die in<br />
Windows <strong>Forms</strong> verwendet werden). Wie bei Windows <strong>Forms</strong> kann man Controls einfach<br />
auf ein Formular ziehen und schreibt den ergänzenden Programmcode entweder<br />
direkt hinein oder in besondere Code-Behind-Seiten. Allerdings wird bei <strong>Web</strong> <strong>Forms</strong> die<br />
Anwendung auf einem <strong>Web</strong>server betrieben und die Benutzer interagieren <strong>mit</strong> ihr über<br />
einen <strong>Web</strong>browser.<br />
Max.<br />
Linie<br />
| 415<br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Max.<br />
Linie<br />
<strong>Web</strong> <strong>Forms</strong> verstehen<br />
<strong>Web</strong> <strong>Forms</strong> implementieren ein Programmiermodell, bei dem <strong>Web</strong>seiten auf einem<br />
<strong>Web</strong>server dynamisch generiert und über das Internet auf einem Browser ausgegeben<br />
werden. In gewisser Weise sind sie die Nachfolger der ASP-Seiten; durch sie wird die<br />
ASP-Technologie <strong>mit</strong> der traditionellen Programmierung verknüpft.<br />
Bei <strong>Web</strong> <strong>Forms</strong> legt man HTML-Seiten für die statischen Inhalte an und schreibt C#-<br />
Code für die dynamischen Inhalte. Das C#-Programm läuft auf dem Server, und die daraus<br />
resultierenden Daten werden in den statischen HTML-Code integriert, wodurch die<br />
<strong>Web</strong>seiten erzeugt werden. Was schließlich an den Browser gesendet wird, ist nichts weiter<br />
als normales HTML.<br />
<strong>Web</strong> <strong>Forms</strong> sollen auf jedem beliebigen Browser lauffähig sein, daher erzeugt der Server<br />
den für die verschiedenen Browser geeigneten HTML-Code. Um die Logik eines <strong>Web</strong>-<br />
Formulars zu <strong>programmieren</strong>, kann man jede beliebige .NET-Sprache verwenden. Hier<br />
werde ich natürlich C# einsetzen, denn dies ist die von mir bevorzugte Sprache; allerdings<br />
werden ASP-Entwickler, die VBScript eingesetzt haben, vielleicht eher auf VB.NET<br />
zurückgreifen.<br />
Genau wie Windows <strong>Forms</strong> kann man auch <strong>Web</strong> <strong>Forms</strong> <strong>mit</strong> dem Notepad (oder einem<br />
beliebigen anderen Editor) erstellen und muß nicht Visual Studio einsetzen. Viele Entwickler<br />
werden dies auch tun, aber Visual Studio macht den Prozeß des Entwerfens und<br />
Testens von <strong>Web</strong> <strong>Forms</strong> doch sehr viel leichter.<br />
<strong>Web</strong> <strong>Forms</strong> teilen die <strong>Web</strong>-Anwendung in zwei Bereiche auf: in den sichtbaren Teil bzw.<br />
die Benutzerschnittstelle (User Interface, UI) und in die dahinterliegende Logik. Das<br />
ähnelt der Entwicklung von Windows <strong>Forms</strong>, die wir in Kapitel 14 gesehen haben, allerdings<br />
befinden sich bei <strong>Web</strong> <strong>Forms</strong> die Benutzeroberfläche und der Programmcode in<br />
getrennten Dateien.<br />
Die Benutzeroberfläche wird in einer Datei <strong>mit</strong> der Erweiterung .aspx gespeichert. Die zu<br />
der Seite gehörende Logik (der Programmcode) kann in einer gesonderten C#-Quelldatei<br />
(Code-Behind-Datei) gespeichert werden. Wenn Sie das Formular laufen lassen, wird die<br />
Code-Behind-Klassendatei ausgeführt und erzeugt dynamisch die HTML-Seite, die an<br />
den Client-Browser gesendet wird. Dieser Programmcode nutzt die reichhalten <strong>Web</strong><br />
<strong>Forms</strong>-Typen, die sich in den Namensräumen System.<strong>Web</strong> und System.<strong>Web</strong>.UI der Framework<br />
Class Library (FCL) befinden und Bestandteil von .NET sind.<br />
Wenn man Visual Studio verwendet, kann man sich die Programmierung von <strong>Web</strong><br />
<strong>Forms</strong> kaum einfacher vorstellen: Man öffnet ein Formular, zieht einige Controls darauf<br />
und schreibt den Programmcode zur Behandlung der Events. Schon ist die <strong>Web</strong>-Anwendung<br />
fertig.<br />
Links<br />
Max.<br />
Linie<br />
416 | Kapitel 15: <strong>Web</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong> <strong>programmieren</strong><br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts<br />
Allerdings kann es auch <strong>mit</strong> Visual Studio eine entmutigende Aufgabe sein, eine robuste<br />
und vollständige <strong>Web</strong>-Anwendung zu schreiben. <strong>Web</strong> <strong>Forms</strong> ermöglichen eine ausgesprochen<br />
reichhaltige Benutzeroberfläche; die Zahl und die Komplexität der <strong>Web</strong>-Controls<br />
haben sich in den letzten Jahren stark vervielfacht, und die Erwartungen der<br />
Benutzer an das Look-and-Feel von <strong>Web</strong>-<strong>Anwendungen</strong> sind dementsprechend gestiegen.<br />
Dazu kommt, daß <strong>Web</strong>-<strong>Anwendungen</strong> von Natur aus verteilt sind. Typischerweise<br />
befindet sich der Client nicht im selben Gebäude wie der Server. Bei den meisten <strong>Web</strong>-<br />
<strong>Anwendungen</strong> muss man die Netzwerk-Latenz, die Bandbreite und die Performance des<br />
Netz-Servers <strong>beim</strong> Erstellen der Benutzeroberfläche berücksichtigen; der Hin- und Rückweg<br />
vom Client zum Host kann durchaus einige Sekunden dauern.<br />
Max.<br />
Linie<br />
Events unter <strong>Web</strong> <strong>Forms</strong><br />
<strong>Web</strong> <strong>Forms</strong> sind Event-getrieben. Events (Ereignisse) kapseln die Vorstellung davon, daß<br />
»etwas geschehen« ist, in einem Objekt. Ein Event wird ausgelöst, wenn der Benutzer<br />
eine Schaltfläche anklickt, etwas aus einer Listbox auswählt oder sonstwie <strong>mit</strong> der Oberfläche<br />
interagiert. Events können auch durch das System erzeugt werden, wenn es eine<br />
Tätigkeit beginnt oder beendet. Wenn man beispielsweise eine Datei zum Lesen öffnet,<br />
wird ein Event ausgelöst, sobald die Datei vollständig in den Arbeitsspeicher eingelesen<br />
worden ist.<br />
Eine Methode, die auf ein Event reagiert, nennt man Event-Handler. Event-Handler werden<br />
als C#-Programm in die Code-Behind-Seite geschrieben und durch Kontrollattribute<br />
<strong>mit</strong> den Controls der HTML-Seite verknüpft.<br />
Event-Handler sind Delegates (siehe Kapitel 12). Konventionsgemäß liefern Event-Handler<br />
für ASP.NET einen void-Wert und haben zwei Parameter. Der erste Parameter<br />
bezeichnet das Objekt, vom dem das Event ausgelöst worden ist. Der zweite wird als<br />
Event-Argument bezeichnet und enthält gegebenenfalls Informationen, die für das Event<br />
spezifisch sind. Bei den meisten Events ist das Event-Argument vom eigenschaftslosen<br />
Typ EventArgs. Bei manchen Controls ist das Event-Argument von einem Typ, der von<br />
EventArgs abgeleitet ist und für die jeweilige Art des Events spezifische Eigenschaften<br />
hat.<br />
Bei den meisten <strong>Web</strong>-<strong>Anwendungen</strong> werden Events normalerweise auf dem Server<br />
behandelt und erfordern daher eine Hin- und Rückübertragung. ASP.NET unterstützt<br />
nur eine begrenzte Menge von Events, so etwa Button-Klicks und die Änderungen an<br />
Texten. Dies sind Events, bei denen der Benutzer eine sichtbare Veränderung erwarten<br />
kann, im Gegensatz zu den Windows-Events (wie Mouse-Over), die während einer einzigen<br />
Benutzer-Aktivität häufig vorkommen können.<br />
Max.<br />
Linie<br />
<strong>Web</strong> <strong>Forms</strong> verstehen | 417<br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Postback-Events und Non-Postback-Events<br />
Postback-Events sind solche Events, die dazu führen, daß das Formular un<strong>mit</strong>telbar an<br />
den Server zurückgesandt wird. Dazu gehören Maus-Events wie zum Beispiel Button-<br />
Click. Im Gegensatz dazu werden viele Events (typischerweise bei Änderungen) als Non-<br />
Postback angesehen, die nicht sofort an den Server zurückgesandt werden. Solche Events<br />
werden statt dessen vom Control zwischengespeichert, bis das nächste Postback-Event<br />
auftritt. Man kann Controls <strong>mit</strong> Non-Postback-Events zwingen, sich wie Postbacks zu<br />
verhalten, indem man ihre Eigenschaft AutoPostBack auf true setzt.<br />
Zustand<br />
Der Zustand einer <strong>Web</strong>-Anwendung ist der aktuelle Wert all ihrer Controls und Variablen<br />
in Hinblick auf den aktuellen Benutzer und die aktuelle Sitzung. Das <strong>Web</strong> selbst ist<br />
eine »zustandslose« Umgebung. Das heißt, was an den Server gesendet wird, hat keinen<br />
Zusammenhang <strong>mit</strong> vorangegangenen Sendungen, sofern nicht der Entwickler die notwendigen<br />
Anstrengungen unternimmt, um das Wissen über den Zustand festzuhalten.<br />
Allerdings bietet ASP.NET Unterstützung bei der Zustandsverwaltung von Benutzersitzungen.<br />
Nachdem eine Seite an den Server übergeben worden ist, erstellt der Server sie stets von<br />
Grund auf neu, bevor er sie an den Browser zurücksendet. ASP.NET bietet die notwendigen<br />
Mechanismen, um den Zustand der Server-Controls festzuhalten. Wenn Sie zum Beispiel<br />
eine Liste anbieten und der Benutzer eine Auswahl aus dieser Liste vorgenommen<br />
hat, bleibt daher diese Auswahl erhalten, nachdem die Seite an den Server zurückgesandt<br />
und anschließend vom Client neu aufgebaut wurde.<br />
Links<br />
Max.<br />
Linie<br />
Der Lebenszyklus eines <strong>Web</strong>-Formulars<br />
Jede Anfrage nach einer Seite verursacht eine Kette von Events auf dem Server. Diese<br />
Events bilden, vom Anfang bis zum Ende, den Lebenszyklus der Seite und all ihrer Komponenten.<br />
Der Lebenszyklus beginnt <strong>mit</strong> einer Anfrage an den Server, die diesen zum<br />
Laden der Seite veranlaßt. Nachdem die Anfrage abgeschlossen ist, wird die Seite freigegeben.<br />
Vom Anfang bis zum Ende des Lebenzyklus besteht das Ziel darin, geeigneten<br />
HTML-Code für den anfragenden Browser zu erzeugen. Der Lebenszyklus einer Seite<br />
wird durch die folgenden Ereignisse gekennzeichnet; jedes von ihnen können Sie entweder<br />
selbst behandeln oder der Standardbehandlung durch den ASP.NET-Server überlassen:<br />
Initialize (Initialisieren)<br />
Die Initialisierung ist die erste Phase im Lebenszyklus jeder Seite und jedes Controls.<br />
An dieser Stelle werden alle Einstellungen initialisiert, die für die Dauer der eingehenden<br />
Anfrage benötigt werden.<br />
Max.<br />
Linie<br />
418 | Kapitel 15: <strong>Web</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong> <strong>programmieren</strong><br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts<br />
Max.<br />
Linie<br />
Load ViewState (ViewState laden)<br />
Die Eigenschaft ViewState des Controls wird gefüllt. Die ViewState-Information<br />
kommt aus einer verborgenen Variablen des Controls, die dazu dient, ihren Zustand<br />
über mehrere Anfragen an den Server hinweg zu bewahren. Der Eingabe-String dieser<br />
verborgenen Variablen wird durch das Seiten-Framework gelesen, und die Eigenschaft<br />
ViewState wird dementsprechend gesetzt. Dieser Vorgang kann durch die<br />
Methode LoadViewState() modifiziert werden. Dadurch erhält ASP.NET die Möglichkeit,<br />
den Zustand des Controls über ein erneutes Laden der Seite hinweg zu verwalten,<br />
so daß das Control nicht auf seinen Ursprungszustand zurückgesetzt wird,<br />
wenn die Seite übersandt wird.<br />
Process Postback Data (Postback-Informationen verarbeiten)<br />
Während dieser Phase werden die Daten verarbeitet, die der Server <strong>beim</strong> Übersenden<br />
der Daten erhalten hat. Wenn diese Daten es erfordern, daß der ViewState aktualisiert<br />
wird, erfolgt der Update über die Methode LoadPostData( ).<br />
Load (Seite laden)<br />
Falls es erforderlich ist, wird die Methode CreateChildControls() aufgerufen, um die<br />
Controls in der Baumstruktur zu initialisieren. Der Zustand wird zurückgesetzt, und<br />
die Controls zeigen die Client-seitigen Daten an. Die Ladephase kann modifiziert<br />
werden, indem das Event Load durch die Methode OnLoad modifiziert wird.<br />
Send Postback Change Modifications (Änderungen der Postback-Information senden)<br />
Wenn es Veränderungen zwischen dem aktuellen und dem vorherigen Zustand gibt,<br />
werden <strong>mit</strong> Hilfe der Methode RaisePostDataChangedEvent() Change-Events ausgelöst.<br />
Handle Postback Events (Postback-Events behandeln)<br />
Das Client-seitige Ereignis, in dessen Folge das Formular zurückgesendet wurde,<br />
wird behandelt.<br />
PreRender (Vor Seitenaufbau)<br />
Die Phase un<strong>mit</strong>telbar vor der Erzeugung der Ausgabe an den Browser. Im wesentlichen<br />
haben Sie hier die letzte Chance, die Ausgabe zu modifizieren, indem Sie die<br />
Methode OnPreRender() verwenden.<br />
Save State (Zustand sichern)<br />
Kurz nach dem Beginn des Lebenszyklus ist der View-State aus einer verborgenen<br />
Variablen ausgelesen worden. Nun wird er in die verborgene Variable zurückgeschrieben,<br />
die als String-Objekt überdauert und die Rücksendung an den Client<br />
beendet. Sie können dieses Verhalten <strong>mit</strong> Hilfe der Methode SaveViewState() überschreiben.<br />
Render (Seite aufbauen)<br />
An dieser Stelle werden die Ausgaben generiert, die an den Clienten geschickt werden<br />
sollen. Dies können Sie <strong>mit</strong> Hilfe der Methode Render überschreiben. Falls erforderlich,<br />
wird hier CreateChildControls() aufgerufen, um die Server-Controls im<br />
Control-Baum zu initialisieren.<br />
Max.<br />
Linie<br />
<strong>Web</strong> <strong>Forms</strong> verstehen | 419<br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Dispose (Seite freigeben)<br />
Dies ist die letzte Phase des Lebenszyklus. Sie bietet Ihnen die Möglichkeit, abschließende<br />
Aufräumarbeiten durchzuführen und Referenzen auf irgendwelche anspruchsvollen<br />
Ressourcen freizugeben, zum Beispiel auf Datenbankverbindungen. Dies<br />
können Sie <strong>mit</strong> der Methdoe Dispose() ändern.<br />
Ein <strong>Web</strong>-Formular erstellen<br />
Um ein einfaches <strong>Web</strong>-Formular zu erstellen, das wir im nächsten Beispiel benötigen,<br />
starten wir Visual Studio .NET und öffnen ein neues Projekt namens CSharp-<br />
<strong>Web</strong>Programmierung. Wählen Sie den Ordner für Visual-C#-Projekte (denn C# ist die<br />
Sprache der Wahl), wählen Sie ASP.NET-<strong>Web</strong>-Anwendung als Projekttyp aus, und<br />
geben Sie folgenden Namen ein: CSharp<strong>Web</strong>Programmierung. Visual Studio .NET zeigt<br />
dann http://localhost/ als Standardadresse an, wie Sie in Abbildung 15-1 sehen.<br />
Links<br />
Abbildung 15-1: Erstellung eines Projekts im Fenster Neues Projekt von Visual Studio .NET<br />
Visual Studio legt fast alle Dateien, die es für das Projekt erzeugt, in einem Ordner unterhalb<br />
der Standard-<strong>Web</strong>site Ihres Rechners ab, zum Beispiel in CSharp<strong>Web</strong>Programmierung.<br />
Max.<br />
Linie<br />
In Visual Studio .NET wird eine Gruppe von Projekten als Projektmappe<br />
bezeichnet; jedes Projekt erzeugt eine Dynamic Link Library (DLL) oder<br />
eine ausführbare Datei (EXE). Alle Projekte werden im Kontext einer Projektmappe<br />
erzeugt, und Projektmappen werden in .sln- und .suo-Dateien<br />
verwaltet.<br />
Max.<br />
Linie<br />
420 | Kapitel 15: <strong>Web</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong> <strong>programmieren</strong><br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts<br />
Die Dateien einer Projektmappe werden, wie auch die anderen Visual Studio-spezifischen<br />
Dateien, unter \Dokumente und Einstellungen\\Eigene<br />
Dateien\Visual Studio Projects abgelegt (wobei und vom<br />
jeweiligen Rechner abhängig sind).<br />
Um <strong>Web</strong> <strong>Forms</strong> zu verwenden, müssen Sie den IIS und die FrontPage-Server-Erweiterungen<br />
auf Ihrem Computer installiert haben. Zur Konfiguration<br />
der FrontPage-Server-Erweiterungen öffnen Sie den Internet Service<br />
Manager und klicken <strong>mit</strong> der rechten Maustaste auf die <strong>Web</strong>site. Wählen<br />
Sie dann All Tasks ➝ Configure Server Extensions. Weitere Informationen<br />
finden Sie unter http://www.microsoft.com.<br />
Wenn Sie eine neue Anwendung beginnen, erzeugt Visual Studio eine Anzahl von<br />
Dateien für Ihr Projekt. Das <strong>Web</strong>-Formular selbst wird in einer Datei namens<br />
<strong>Web</strong>Form1.aspx gespeichert. Diese Datei enthält ausschließlich HTML. Eine zweite,<br />
gleich wichtige Datei heißt <strong>Web</strong>Form1.aspx.cs und enthält den C#-Code, der <strong>mit</strong> Ihrem<br />
Formular verbunden ist. Dies ist die Code-Behind-Datei.<br />
Beachten Sie, daß die Code-Behind-Datei nicht im Projektmappen-Explorer auftaucht.<br />
Um die Code-Behind-Datei (.cs) zu sehen, müssen Sie den Cursor innerhalb von Visual<br />
Studio .NET setzen, das Formular <strong>mit</strong> der rechten Maustaste anklicken und im Pop-Up-<br />
Menü »View Code« anwählen. Nun können Sie zwischen dem Formular selbst, der Datei<br />
<strong>Web</strong>Form1.aspx und der C#-Code-Behind-Datei <strong>Web</strong>Form1.aspx.cs hin- und herschalten.<br />
Wenn Sie sich das Formular in <strong>Web</strong>Form1.aspx ansehen, können Sie zwischen dem<br />
Design- und dem HTML-Modus umschalten, indem Sie auf die Reiter unterhalb des Editor-<br />
Fensters klicken. Im Design-Modus können Sie Controls in Ihr Formular ziehen, und im<br />
HTML-Modus können Sie den HTML-Code direkt betrachten und bearbeiten.<br />
Sehen Sie sich die .aspx- und die Code-Behind-Dateien näher an, die Visual Studio<br />
erzeugt. Benennen Sie zunächst <strong>Web</strong>Form1.aspx in Hello<strong>Web</strong>.aspx um. Dazu schließen<br />
Sie <strong>Web</strong>Form1.aspx und klicken dann deren Namen im Projektmappen-Explorer <strong>mit</strong> der<br />
rechten Maustaste an. Wählen Sie »Rename«, und geben Sie den Namen Hello<strong>Web</strong>.aspx<br />
ein. Nach dem Umbenennen öffen Sie Hello<strong>Web</strong>.aspx und sehen sich den Code an. Sie<br />
werden feststellen, daß die Code-Behind-Datei ebenfalls in Hello<strong>Web</strong>.aspx.cs umbenannt<br />
worden ist.<br />
Wenn Sie eine neue <strong>Web</strong> <strong>Forms</strong>-Anwendung erzeugen, generiert Visual Studio .NET<br />
einen Code-Rumpf wie in Beispiel 15-1, <strong>mit</strong> dem Sie beginnen können.<br />
Beispiel 15-1: Vom Assistenten generierter Code für ein <strong>Web</strong>-Formular<br />
Max.<br />
Linie<br />
<br />
Max.<br />
Linie<br />
Ein <strong>Web</strong>-Formular erstellen | 421<br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Beispiel 15-1: Vom Assistenten generierter Code für ein <strong>Web</strong>-Formular (Fortsetzung)<br />
<br />
<br />
<br />
<strong>Web</strong>Form1<br />
<br />
<br />
<br />
<br />
<br />
<br />
Links<br />
Max.<br />
Linie<br />
<br />
<br />
<br />
<br />
Alles, was Sie hier sehen, ist typischer HTML-Vorlagentext. Eine Ausnahme davon ist die<br />
erste Zeile, die den folgenden ASP.NET-Code enthält:<br />
<br />
Das Attribut language zeigt an, daß die in der Code-Behind-Seite verwendete Sprache C#<br />
ist. Das Attribut Codebehind legt fest, daß der Dateiname dieser Seite Hello<strong>Web</strong>.cs ist, und<br />
dem Attribut Inherits ist zu entnehmen, daß diese Seite von <strong>Web</strong>Form1 abgeleitet ist. Die<br />
Klasse <strong>Web</strong>Form1 wird in Hello<strong>Web</strong>.cs deklariert:<br />
public class <strong>Web</strong>Form1 : System.<strong>Web</strong>.UI.Page<br />
Der C#-Code macht deutlich, daß <strong>Web</strong>Form1 von System.<strong>Web</strong>.UI.Page abstammt. In dieser<br />
Klasse sind Eigenschaften, Methoden und Events definiert, die allen serverseitigen Seiten<br />
gemeinsam sind.<br />
Wenn Sie nun zur HTML-Ansicht von Hello<strong>Web</strong>.aspx zurückkehren, sehen Sie, daß im<br />
Body der Seite <strong>mit</strong> Hilfe des Standard-HTML-Tags form ein Formular beschrieben wird:<br />
<br />
<strong>Web</strong> <strong>Forms</strong> geht davon aus, daß Sie wenigstens ein Formular benötigen, um <strong>mit</strong> dem<br />
Benutzer interagieren zu können, und erzeugt eines, sobald Sie ein neues Projekt anlegen.<br />
Das Attribut runat="server" stellt den Schlüssel zum serverseitigen Hokuspokus dar.<br />
Jedes Tag, das dieses Attribut enthält, wird als serverseitiges Control betrachtet und wird<br />
vom ASP.NET-Framework auf dem Server ausgeführt.<br />
Max.<br />
Linie<br />
422 | Kapitel 15: <strong>Web</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong> <strong>programmieren</strong><br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts<br />
Nachdem Sie ein leeres <strong>Web</strong>-Formular angelegt haben, sollten Sie erst einmal etwas Text<br />
in die Seite einfügen. Wenn Sie zur HTML-Ansicht umschalten, können Sie Skript- und<br />
HTML-Code direkt in die Datei schreiben, genau wie Sie es <strong>beim</strong> klassischen ASP taten.<br />
Fügen Sie die folgende Zeile in den Body-Abschnitt der HTML-Seite ein, und lassen Sie<br />
da<strong>mit</strong> einen Gruß und die aktuelle Ortszeit erscheinen:<br />
Hello World! Es ist jetzt <br />
Die Kennzeichen funktionieren genauso wie <strong>beim</strong> klassischen ASP; sie zeigen<br />
an, daß sich zwischen ihnen Programmcode befindet (in diesem Fall C#). Das Gleichheitszeichen,<br />
das un<strong>mit</strong>telbar auf das öffnende Tag folgt, veranlaßt ASP.NET zur Ausgabe<br />
des enthaltenen Wertes, genau wie ein Aufruf von Response.Write( ). Ebenso<br />
einfach könnten Sie die folgende Zeile schreiben:<br />
Hello World! Es ist jetzt<br />
<br />
Führen Sie die Seite <strong>mit</strong> Hilfe von Ctrl-F5 aus (oder speichern Sie die Seite und navigieren<br />
Sie <strong>mit</strong> dem Browser zu ihr). Sie sollten nun den in im Browser ausgegebenen Text wie in<br />
Abbildung 15-2 sehen.<br />
Abbildung 15-2: Von der Datei HelloWorld.aspx generierte Ausgabe<br />
Max.<br />
Linie<br />
Controls hinzufügen<br />
Sie können einem <strong>Web</strong>-Formular serverseitige Controls auf zweierlei Art hinzufügen:<br />
manuell (indem Sie den HTML-Code direkt in die Seite schreiben) oder dadurch, daß Sie<br />
Controls aus der Toolbox in den Seitenentwurf ziehen. Wenn Sie beispielsweise Buttons<br />
verwenden wollen, da<strong>mit</strong> der Benutzer eine der drei in der Northwind-Datenbank enthaltenen<br />
Versandfirmen auswählen kann, können Sie den folgenden HTML-Code innerhalb<br />
des -Elements in das HTML-Fenster schreiben:<br />
<br />
<br />
<br />
Max.<br />
Linie<br />
Controls hinzufügen | 423<br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
<br />
<br />
Durch die asp-Tags werden serverseitige ASP.NET-Controls deklariert, die vom Server<br />
bei der Verarbeitung der Seite durch normales HTML ersetzt werden. Wenn Sie die<br />
Anwendung laufen lassen, zeigt der Browser drei Radio-Buttons innerhalb einer Button-<br />
Group an; sobald Sie einen von ihnen anklicken, werden die anderen ausgeschaltet.<br />
Denselben Effekt erreichen Sie einfacher, indem Sie die drei Buttons aus der Visual-Studio-Toolbox<br />
auf das Formular ziehen, wie Abbildung 15-3 illustriert.<br />
Links<br />
Max.<br />
Linie<br />
Abbildung 15-3: Buttons in ein <strong>Web</strong>-Formular ziehen<br />
Max.<br />
Linie<br />
424 | Kapitel 15: <strong>Web</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong> <strong>programmieren</strong><br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts<br />
Die Controls eines Formulars können auf zwei verschiedene Arten angeordnet werden.<br />
Der Standardmodus ist GridLayout. Controls, die Sie im GridLayout einfügen, bekommen<br />
im Browser eine absolute Position (also feste x- und y-Koordinaten).<br />
Die Alternative dazu ist FlowLayout. Beim FlowLayout werden die Controls im Formular<br />
wie bei einem Microsoft Word-Dokument von oben nach unten hinzugefügt. Wenn Sie<br />
vom Grid-Layout oder zurück umschalten möchten, ändern Sie im Visual Studio .NET<br />
die Eigenschaft pageLayout des Dokuments.<br />
<strong>Web</strong> <strong>Forms</strong> bietet zwei Arten von serverseitigen Controls. Die erste Art sind serverseitige<br />
HTML-Controls, auch <strong>Web</strong>-Controls genannt. Dabei handelt es sich um Standard-<br />
HTML-Controls, die <strong>mit</strong> dem zusätzlichen Attribut runat=Server gekennzeichnet sind.<br />
Alternativ zu den <strong>Web</strong>-Controls gibt es ASP.NET-Server-Controls, die auch als ASP-<br />
Controls bezeichnet werden. ASP-Controls sind dafür gedacht, die Standard-HTML-<br />
Controls zu ersetzen. ASP-Controls bieten ein konsistenteres Objektmodell und konsistenter<br />
benannte Attribute. Zum Beispiel gibt es bei HTML-Controls unzählige verschiedene<br />
Möglichkeiten, <strong>mit</strong> Eingaben umzugehen:<br />
<br />
<br />
<br />
<br />
<br />
Jede von ihnen verhält sich unterschiedlich und hat andere Attribute. Die ASP-Controls<br />
sollen die Menge der Controls normalisieren, indem Attribute konsistent über das ganze<br />
Objektmodell der ASP-Controls hinweg verwendet werden. Die ASP-Controls, die den<br />
obigen serverseitigen HTML-Controls entsprechen, sind:<br />
<br />
<br />
<br />
<br />
<br />
Der Rest dieses Kapitels bezieht sich auf ASP-Controls.<br />
Datenanbindung<br />
Es gibt diverse Technologien, <strong>mit</strong> deren Hilfe Programmierer Controls an Daten binden<br />
können. Das heißt, wenn die Daten geändert werden, reagieren die Controls automatisch.<br />
Wie Rocky jedoch zu Bullwinkle 1 zu sagen pflegte, »hat dieser Trick noch nie funktioniert«.<br />
Gebundene Controls bieten häufig nur begrenzte Kontrolle über ihr Look-and-<br />
Max.<br />
Linie<br />
1 Amerikanische Comic-Figuren aus den sechziger Jahren. Den zitierten Sketch kann man sich unter http://flash.<br />
artie.com/arg-rocker-and-bullmoose.html live ansehen; d. Übers.<br />
Max.<br />
Linie<br />
Datenanbindung | 425<br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Feel, und die Performance läßt gewöhnlich zu wünschen übrig. Die Designer von ASP.<br />
NET machten sich daran, diese Probleme zu lösen, und haben für ein Sortiment robuster<br />
datengebundener Controls gesorgt, <strong>mit</strong> denen die Anzeige und die Änderung von Daten<br />
vereinfacht werden, ohne daß sich dadurch die Performance oder die Kontrolle über die<br />
Benutzerschnittstelle verschlechtern.<br />
Im vorangehenden Abschnitt haben wir Radio-Buttons auf einem Formular fest einprogrammiert<br />
– einen für jede Versandfirma der Northwind-Datenbank. Das ist sicher nicht<br />
die beste Möglichkeit, denn sobald es eine Änderung bezüglich der Versandfirmen in der<br />
Datenbank gibt, muß man die Controls neu verdrahten. Dieser Abschnitt zeigt, wie Sie<br />
solche Controls dynamisch erzeugen und <strong>mit</strong> Daten in der Datenbank verknüpfen.<br />
Sie wollen sicher die Radio-Buttons in Abhängigkeit von den Daten in der Datenbank<br />
erzeugen, da Sie zur Entwurfszeit nicht wissen können, welchen Text die Buttons enthalten<br />
sollen, ja nicht einmal, wie viele Buttons Sie überhaupt benötigen. Um dies zu erreichen,<br />
verwenden Sie eine RadioButtonList. Die RadioButtonList ist ein Control, <strong>mit</strong> dem<br />
Sie Radio-Buttons programmgesteuert erzeugen können; Sie geben den Namen und die<br />
Werte für die Buttons an, alles weitere erledigt ASP.NET für Sie.<br />
Löschen Sie die Radio-Buttons, die sich bereits auf dem Formular befinden, und ziehen<br />
Sie eine RadioButtonList an ihre Stelle. Sobald sie an ihrem Platz ist, können Sie das<br />
Eigenschaftenfenster verwenden, um sie in rbl1 umzubenennen.<br />
Links<br />
Max.<br />
Linie<br />
Anfangswerte festlegen<br />
Die Programmierung in <strong>Web</strong> <strong>Forms</strong> ist ereignisorientiert; Sie schreiben den Code, der auf<br />
diverse Events reagiert. Typischerweise werden die Events, auf die Sie reagieren, vom<br />
Benutzer ausgelöst. So wird beispielsweise ein Button-Click-Event erzeugt, wenn der<br />
Benutzer einen Button anklickt.<br />
Das wichtigste Event zu Beginn ist Page_Load, das jedesmal <strong>beim</strong> Laden eines <strong>Web</strong>-Formulars<br />
ausgelöst wird. Wenn die Seite geladen wird, sollten die Radio-Buttons <strong>mit</strong> Werten<br />
aus der Datenbank gefüllt werden. Wenn Sie beispielsweise ein Bestellformular<br />
entwickeln, wollen Sie vielleicht einen Radio-Button für jeden möglichen Versandweg<br />
erzeugen, also für UPS, FedEx und so weiter. Daher sollten Sie in der Methode Page_Load<br />
den Programmcode zum Erzeugen der Buttons unterbringen.<br />
Sinnvollerweise setzen Sie diese Werte für die Radio-Buttons nur dann, wenn die Seite<br />
zum erstenmal geladen wird. Wenn dagegen der Benutzer einen Button anklickt oder<br />
irgend etwas anderes unternimmt, wodurch die Seite an den Server zurückgesandt wird,<br />
wollen Sie die Werte nicht <strong>beim</strong> erneuten Laden der Seite noch einmal aus der Datenbank<br />
lesen.<br />
ASP.NET kann zwischen dem ersten Anzeigen der Seite und ihrer späteren, erneuten<br />
Darstellung, nachdem Sie durch einen Client an den Server zurückgesandt wurde, unterscheiden.<br />
Jede <strong>Web</strong> Form-Seite hat eine Eigenschaft IsPostBack, deren Inhalt wahr ist,<br />
Max.<br />
Linie<br />
426 | Kapitel 15: <strong>Web</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong> <strong>programmieren</strong><br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts<br />
wenn die Seite als Antwort auf ein Client-Postback geladen wird, und deren Inhalt falsch<br />
ist, wenn sie zum erstenmal geladen wird.<br />
Also prüfen Sie den Wert von IsPostBack. Ist er falsch, so wissen Sie, daß die Seite erstmalig<br />
angezeigt wird – daß es also Zeit ist, die Werte aus der Datenbank zu holen:<br />
protected void Page_Load(object sender, EventArgs e)<br />
{<br />
if (!IsPostBack)<br />
{//... }<br />
}<br />
Die Argumente für die Methode Page_Load entsprechen den normalen Event-Argumenten,<br />
die in Kapitel 12 behandelt worden sind.<br />
Max.<br />
Linie<br />
Mit der Datenbank verbinden<br />
Der Code, <strong>mit</strong> dem die Verbindung zur Datenbank hergestellt und ein Dataset gefüllt<br />
wird, kommt Ihnen bekannt vor, denn er ist fast identisch <strong>mit</strong> dem, was Sie in Kapitel 14<br />
gesehen haben. Es gibt keinerlei Unterschied zwischen der Erzeugung eines Datasets für<br />
<strong>Web</strong> <strong>Forms</strong> und der Erzeugung eines Datasets für Windows <strong>Forms</strong>.<br />
Beginnen Sie da<strong>mit</strong>, daß Sie die benötigten Member-Variablen deklarieren:<br />
private System.Data.SqlClient.SqlConnection myConnection;<br />
private System.Data.DataSet myDataSet;<br />
private System.Data.SqlClient.SqlCommand myCommand;<br />
private System.Data.SqlClient.SqlDataAdapter dataAdapter;<br />
Wie in Kapitel 14 verwenden wir die SQL-Versionen von SqlConnection und data-<br />
Adapter. Legen Sie den connectionString für die Northwind-Datenbank an, <strong>mit</strong> dem Sie<br />
das SQLConnection-Objekt instantiieren und öffnen:<br />
string connectionString = "server=(local)\\NetSDK;" +<br />
"Trusted_Connection=yes; database=northwind";<br />
myConnection =<br />
new System.Data.SqlClient.SqlConnection(connectionString);<br />
myConnection.Open( );<br />
Erzeugen Sie das Dataset, und legen Sie fest, daß es bei Abfragen die Groß-/Kleinschreibung<br />
beachtet:<br />
myDataSet = new System.Data.DataSet( );<br />
myDataSet.CaseSensitive=true;<br />
Als nächstes erzeugen Sie das SqlCommand-Objekt und weisen es dem Verbindungsobjekt<br />
und der Select-Anweisung zu, <strong>mit</strong> dem Sie die Firmennummer und den Firmennamen<br />
er<strong>mit</strong>teln, die jede mögliche Versandfirma identifizieren. Verwenden Sie dann den<br />
Namen als Text und die ShipperID als Wert des Radio-Buttons:<br />
myCommand = new System.Data.SqlClient.SqlCommand( );<br />
myCommand.Connection=myConnection;<br />
myCommand.CommandText = "Select ShipperID, CompanyName from Shippers";<br />
Max.<br />
Linie<br />
Datenanbindung | 427<br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Nun erzeugen Sie das dataAdapter-Objekt, setzen dessen Eigenschaft SelectCommand auf<br />
Ihr Command-Objekt und fügen die Tabelle Shippers zu seinen Tabellen-Mappings<br />
hinzu:<br />
dataAdapter = new System.Data.SqlClient.SqlDataAdapter( );<br />
dataAdapter.SelectCommand= myCommand;<br />
dataAdapter.TableMappings.Add("Table","Shippers");<br />
Füllen Sie schließlich den dataAdapter <strong>mit</strong> den Ergebnissen der Abfrage:<br />
dataAdapter.Fill(myDataSet);<br />
Das ist alles weitgehend identisch <strong>mit</strong> dem, was Sie schon in Kapitel 14 gesehen haben.<br />
Allerdings binden Sie diesmal die Daten an die zuvor angelegte RadioButtonList.<br />
Zu diesem Zweck legen Sie zunächst die Eigenschaften des RadioButtonList-Objekts fest.<br />
Die erste Eigenschaft, die hier von Interesse ist, teilt der RadioButtonList <strong>mit</strong>, wie die<br />
Radio-Buttons auf der Seite angeordnet werden sollen:<br />
rbl1.RepeatLayout =<br />
System.<strong>Web</strong>.UI.<strong>Web</strong>Controls.RepeatLayout.Flow;<br />
Flow ist einer von zwei möglichen Werten der Enumeration RepeatLayout. Der andere<br />
Wert ist Table, durch den die Radio-Buttons tabellenförmig angezeigt werden. Als nächstes<br />
müssen Sie der RadioButtonList sagen, welche Werte aus dem Dataset für die<br />
Anzeige (das DataTextField) und welche dafür verwendet werden sollen, daß sie im Falle<br />
der Auswahl durch den Benutzer zurückgegeben werden sollen (das DataValueField):<br />
rbl1.DataTextField = "CompanyName";<br />
rbl1.DataValueField = "ShipperID";<br />
Als letztes stellen Sie die Ansicht der Daten ein, die die RadioButtonList verwenden soll.<br />
Für dieses Beispiel ist es die Standardansicht der Tabelle Shippers innerhalb des Datasets:<br />
rbl1.DataSource = myDataSet.Tables["Shippers"].DefaultView;<br />
Wenn dies alles getan ist, können Sie die RadioButtonList an das Dataset binden:<br />
rbl1.DataBind( );<br />
Schließlich sollten Sie noch sicherstellen, daß einer der Radio-Buttons selektiert ist, also<br />
selektieren Sie den ersten:<br />
rbl1.Items[0].Selected = true;<br />
Diese Anweisung greift auf die Collection Items innerhalb der RadioButtonList zu, wählt<br />
deren erstes Element aus (also den ersten Radio-Button) und setzt dessen Eigenschaft<br />
Selected auf true.<br />
Wenn Sie das Programm laufen lassen und <strong>mit</strong> dem Browser zu der Seite navigieren, werden<br />
die Buttons so dargestellt, wie es in Abbildung 15-4 zu sehen ist.<br />
Links<br />
Max.<br />
Linie<br />
Max.<br />
Linie<br />
428 | Kapitel 15: <strong>Web</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong> <strong>programmieren</strong><br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts<br />
Abbildung 15-4: RadioButtonList<br />
Wenn Sie sich den Quelltext der Seite ansehen, werden Sie dort keine RadioButtonList<br />
finden. An ihrer Stelle sind standardmäßige HTML-Radio-Buttons erzeugt worden, die<br />
alle eine gemeinsame ID haben. Dadurch kann der Browser sie als eine Gruppe behandeln.<br />
Ihre Labels sind angelegt worden, und alle Radio-Buttons sind zusammen <strong>mit</strong> den<br />
Labels von einem -Tag umgeben:<br />
Max.<br />
Linie<br />
<br />
<br />
Speedy Express<br />
<br />
<br />
<br />
Dieser HTML-Code wird vom Server dadurch generiert, daß er Ihre RadioButtonList <strong>mit</strong><br />
dem Ergebnis kombiniert, das <strong>beim</strong> Abarbeiten der Code-Behind-Seite entsteht. Beim<br />
Laden der Seite wird die Methode Page_Load( ) aufgerufen, und der Datenadapter wird<br />
gefüllt. Indem Sie das rbl1.DataTextField dem Feld CompanyName und das rbl1.<br />
DataValueField dem Feld ShipperID zuordnen und die rbl1.DataSource der Standardansicht<br />
der Versandfirmentabelle zuordnen, bereiten Sie die Radio-Button-Liste darauf vor,<br />
die Buttons zu generieren. Wenn Sie DataBind aufrufen, werden die Radio-Buttons aus<br />
den in der Datenquelle enthaltenen Daten erzeugt.<br />
Indem Sie nur noch ein paar weitere Controls zufügen, erzeugen Sie ein komplettes Formular,<br />
<strong>mit</strong> dem die Benutzer interagieren können. Zu diesem Zweck ergänzen Sie eine<br />
angemessenere Begrüßung (»Willkommen bei Northwind«), eine Textbox, die den<br />
Namen des Benutzers aufnimmt, zwei weitere Buttons (Bestellen und Abbrechen) und<br />
einen Text, der dem Feedback an den Benutzer dient. Abbildung 15-5 zeigt das vollständige<br />
Formular.<br />
Dieses Formular wird wohl keine Designpreise gewinnen, aber seine Verwendung illustriert<br />
einige der Kernpunkte von <strong>Web</strong> <strong>Forms</strong>.<br />
Max.<br />
Linie<br />
Datenanbindung | 429<br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Links<br />
Abbildung 15-5: Das Formular<br />
Ich habe noch keinen Entwickler kennengelernt, der nicht glaubte, daß er<br />
eine perfekte Benutzeroberfläche entwerfen könnte. Gleichzeitig habe ich<br />
auch keinen kennengelernt, der es wirklich konnte. Das Design von Oberflächen<br />
ist eine jener Fähigkeiten (wie das Lehren), von denen wir alle<br />
glauben, sie zu beherrschen, aber nur einige wenige talentierte Leute können<br />
es wirklich gut. Als Entwickler kenne ich meine Grenzen; ich schreibe<br />
das Programm und jemand anders macht das Layout der Seite.<br />
Max.<br />
Linie<br />
In Beispiel 15-2 sehen Sie den kompletten HTML-Code der .aspx-Datei.<br />
Beispiel 15-2: Die .aspx-Datei<br />
<br />
<br />
<br />
<br />
<strong>Web</strong>Form1<br />
<br />
<br />
<br />
Max.<br />
Linie<br />
430 | Kapitel 15: <strong>Web</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong> <strong>programmieren</strong><br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts<br />
Beispiel 15-2: Die .aspx-Datei (Fortsetzung)<br />
<br />
<br />
<br />
<br />
Willkommen bei Northwind.<br />
Ihr Name:<br />
Versandfirma:<br />
Bitte wählen Sie eine Versandfirma aus.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Max.<br />
Linie<br />
Die -Controls werden in standardmäßige HTML--Tags umgewandelt.<br />
Wie gesagt, ist die Verwendung der ASP-Controls deswegen vorteilhaft, weil sie<br />
dem Programmierer ein konsistenteres Objektmodell bietet, trotzdem aber standardmäßiger<br />
HTML-Code generiert wird, den jeder Browser darstellen kann. Da die Buttons<br />
Max.<br />
Linie<br />
Datenanbindung | 431<br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
sowohl <strong>mit</strong> dem Attribut runat=Server gekennzeichnet als auch <strong>mit</strong> einem id-Attribut<br />
versehen sind, können Sie bei Bedarf programmgesteuert aus dem serverseitigen Code<br />
auf diese Buttons zugreifen. Beispiel 15-3 enthält die komplette Code-Behind-Seite zur<br />
Unterstützung des HTML-Codes.<br />
Beispiel 15-3: Die Code-Behind-Seite zur HTML-Unterstützung<br />
using System;<br />
using System.Collections;<br />
using System.ComponentModel;<br />
using System.Data;<br />
using System.Drawing;<br />
using System.<strong>Web</strong>;<br />
using System.<strong>Web</strong>.SessionState;<br />
using System.<strong>Web</strong>.UI;<br />
using System.<strong>Web</strong>.UI.<strong>Web</strong>Controls;<br />
using System.<strong>Web</strong>.UI.HtmlControls;<br />
namespace CSharp<strong>Web</strong>Programmierung<br />
{<br />
// Konstruktor der Seite<br />
public class <strong>Web</strong>Form1 : System.<strong>Web</strong>.UI.Page<br />
{<br />
protected System.<strong>Web</strong>.UI.<strong>Web</strong>Controls.Label Label1;<br />
protected System.<strong>Web</strong>.UI.<strong>Web</strong>Controls.Label Label2;<br />
protected System.<strong>Web</strong>.UI.<strong>Web</strong>Controls.Label Label3;<br />
protected System.<strong>Web</strong>.UI.<strong>Web</strong>Controls.Label lblFeedBack;<br />
protected System.<strong>Web</strong>.UI.<strong>Web</strong>Controls.Button Order;<br />
protected System.<strong>Web</strong>.UI.<strong>Web</strong>Controls.Button Cancel;<br />
protected System.<strong>Web</strong>.UI.<strong>Web</strong>Controls.TextBox txtName;<br />
protected System.<strong>Web</strong>.UI.<strong>Web</strong>Controls.RadioButtonList rbl1;<br />
private System.Data.SqlClient.SqlConnection myConnection;<br />
private System.Data.DataSet myDataSet;<br />
private System.Data.SqlClient.SqlCommand myCommand;<br />
private System.Data.SqlClient.SqlDataAdapter dataAdapter;<br />
Links<br />
Max.<br />
Linie<br />
private void Page_Load(object sender, System.EventArgs e)<br />
{<br />
// Hole <strong>beim</strong> ersten Laden der Seite die Daten,<br />
// und setze die Radio-Buttons<br />
if (!IsPostBack)<br />
{<br />
string connectionString = "server=(local)\\NetSDK;" +<br />
"Trusted_Connection=yes; database=northwind";<br />
myConnection = new System.Data.SqlClient.SqlConnection(<br />
connectionString);<br />
myConnection.Open( );<br />
// Erzeuge das Dataset, und setze eine Eigenschaft<br />
myDataSet = new System.Data.DataSet( );<br />
Max.<br />
Linie<br />
432 | Kapitel 15: <strong>Web</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong> <strong>programmieren</strong><br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts<br />
Beispiel 15-3: Die Code-Behind-Seite zur HTML-Unterstützung (Fortsetzung)<br />
myDataSet.CaseSensitive=true;<br />
// Erzeuge das SqlCommand-Objekt, und weise die<br />
// Verbindung und die Select-Anweisung zu<br />
myCommand = new System.Data.SqlClient.SqlCommand( );<br />
myCommand.Connection=myConnection;<br />
myCommand.CommandText =<br />
"Select ShipperID, CompanyName from Shippers";<br />
// Erzeuge das dataAdapter-Objekt, übergib das<br />
// SqlCommand-Objekt, und setze das Daten-Mapping auf<br />
dataAdapter = new System.Data.SqlClient.SqlDataAdapter( );<br />
dataAdapter.SelectCommand= myCommand;<br />
dataAdapter.TableMappings.Add("Table","Shippers");<br />
// Das dataAdapter-Object füllt das DataSet<br />
dataAdapter.Fill(myDataSet);<br />
// Setze die Eigenschaften der RadioButtonList<br />
rbl1.RepeatLayout =<br />
System.<strong>Web</strong>.UI.<strong>Web</strong>Controls.RepeatLayout.Flow;<br />
rbl1.DataTextField = "CompanyName";<br />
rbl1.DataValueField = "ShipperID";<br />
// Setze die Datenquelle, und binde sie an<br />
rbl1.DataSource = myDataSet.Tables["Shippers"].DefaultView;<br />
rbl1.DataBind( );<br />
}<br />
}<br />
// Selektiere den ersten Button<br />
rbl1.Items[0].Selected = true;<br />
Max.<br />
Linie<br />
#region <strong>Web</strong> Form Designer generated code<br />
override protected void OnInit(EventArgs e)<br />
{<br />
//<br />
// CODEGEN: Dieser Aufruf ist für den<br />
// ASP.NET-<strong>Web</strong>dienst-Designer erforderlich.<br />
//<br />
InitializeComponent( );<br />
base.OnInit(e);<br />
}<br />
/// <br />
/// Erforderliche Methode für die Designerunterstützung.<br />
/// Der Inhalt der Methode darf nicht <strong>mit</strong> dem Code-Editor geändert werden.<br />
/// <br />
private void InitializeComponent( )<br />
{<br />
this.Order.Click += new System.EventHandler(this.Order_Click);<br />
Max.<br />
Linie<br />
Datenanbindung | 433<br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Beispiel 15-3: Die Code-Behind-Seite zur HTML-Unterstützung (Fortsetzung)<br />
this.Load += new System.EventHandler(this.Page_Load);<br />
Links<br />
Max.<br />
Linie<br />
}<br />
#endregion<br />
private void Order_Click(object sender, System.EventArgs e)<br />
{<br />
// Erzeuge die Nachricht, hole dazu die<br />
// Werte aus den Controls<br />
string msg;<br />
msg = "Vielen Dank, " + txtName.Text +". Sie wählten " ;<br />
// Gehe in einer Schleife durch die Radio-Buttons<br />
for (int i = 0;i
Rechts<br />
Dieses Element repräsentiert den Zustand des Formulars (wobei die Werte bereits durch<br />
den Benutzer ausgewählt sind). Beim Neuzeichnen der Seite auf dem Client verwendet<br />
ASP.NET diesen View-Status, um die Controls wieder in ihren vorherigen Zustand zu<br />
versetzen.<br />
Wenn der Benutzer auf den Button Bestellen klickt, wird die Seite übersandt, und es<br />
wird der Event-Handler, der diesem Button zugeordnet ist, aufgerufen:<br />
public void Order_Click (object sender, System.EventArgs e)<br />
{<br />
string msg;<br />
msg = "Vielen Dank, " + txtName.Text +". Sie wählten " ;<br />
for (int i = 0;i
Links<br />
Abbildung 15-6: Übersandte Seite, nachdem der Benutzer auf Bestellen geklickt hat<br />
ASP.NET und C#<br />
Zum Thema ASP.NET gibt es viel zu lernen, aber das meiste davon ist unabhängig von<br />
der Programmiersprache. ASP.NET beinhaltet eine reichhaltige Sammlung von Controls<br />
und da<strong>mit</strong> zusammenhängenden Werkzeugen, darunter Hilfs<strong>mit</strong>tel zur Validierung von<br />
Daten, zur Formatierung von Daten, zur Präsentation von Inseraten, zur Interaktion <strong>mit</strong><br />
dem Benutzer und so weiter. Die meisten von ihnen machen keinerlei Programmierung<br />
erforderlich.<br />
Die Rolle des C#-Programmierers bei der ASP.NET-Entwicklung besteht darin, Event-<br />
Handler zu schreiben, die auf Benutzer-Interaktionen reagieren. Viele der Event-Handler<br />
schreiben entweder Daten in eine Datenbank oder lesen Daten aus und machen sie für<br />
die Controls verfügbar.<br />
Max.<br />
Linie<br />
Max.<br />
Linie<br />
436 | Kapitel 15: <strong>Web</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>Web</strong> <strong>Forms</strong> <strong>programmieren</strong><br />
This is the Title of the Book, eMatter Edition<br />
Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.