09.02.2014 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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&auml;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&auml;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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!