Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Einstieg in ASP.NET von Matthias Lohrer
Einstieg in ASP.NET
gp Kapitel Webserversteuerelemente
  gp 8.1 Webserversteuerelemente formatieren
    gp 8.1.1 Die FontInfo-Klasse
    gp 8.1.2 Die System.Drawing.Color-Struktur
    gp 8.1.3 Die Klasse Unit und die Enumeration UnitType
  gp 8.2 Button
    gp 8.2.1 OnClick
    gp 8.2.2 OnCommand
  gp 8.3 LinkButton
  gp 8.4 ImageButton
  gp 8.5 HyperLink
  gp 8.6 Label
  gp 8.7 Literal
  gp 8.8 Panel
  gp 8.9 TextBox
    gp 8.9.1 Mit JavaScript den Fokus setzen
  gp 8.10 CheckBox
  gp 8.11 Image
  gp 8.12 Webserversteuerelemente für Tabellen
  gp 8.13 RadioButton
  gp 8.14 Calendar
  gp 8.15 AdRotator
  gp 8.16 E-Mails versenden
    gp 8.16.1 Versand von E-Mails mit der Klasse SmtpMail
    gp 8.16.2 E-Mails mit der Klasse MailMessage erstellen


Galileo Computing

8.9 TextBox  downtop


Klasse System.Web.UI.WebControls.TextBox
Deklaration <asp:TextBox id="value"
AutoPostBack="True|False"
Columns="Anzahl Spalten"
MaxLength="characters"
Rows="Anzahl Zeilen"
Text="text"
TextMode=
"SingleLine | MultiLine | Password"
Wrap="True|False"
OnTextChanged="OnTextChanged-Methode"
runat="server"/>
Erzeugter HTML-Code Abhängig vom Parameter TextMode: <input type="text" size="..." ...> oder
<input type="password" size="..." ...> oder
<textarea rows="..." cols="..."> ... </textarea>
Kurzcharakteristik Das TextBox-Webserversteuerelement kann einzeilige und mehrzeilige Texteingabefelder sowie Passwortfelder erzeugen.

Das TextBox-Steuerelement fasst die Funktionalität von drei HTML-Eingabefeldern zusammen. Es kann

gp  einzeilige Texteingabefelder (input type="text" ...),
gp  Passwortfelder (input type="password" ...) und
gp  textarea-Elemente

erzeugen. Über das Attribut TextMode geben Sie den gewünschten Typ des Eingabefelds an. Zur Definition der Breite verwenden Sie das Attribut Columns. Mit MaxLength können Sie die Eingabe auf eine maximal zulässige Anzahl von Zeichen beschränken. Bei mehrzeiligen Eingabefeldern legen Sie mit dem Attribut Wrap fest, ob der Text bei der Eingabe auf die nächste Zeile umbrechen oder ob die Zeile weitergeführt werden soll. Horizontale Scroll-Balken ermöglichen in diesem Fall den Zugriff auf die verdeckten Teile.

Das TextBox-Steuerelement ist eines derjenigen Webserversteuerelemente, die das AutoPostBack-Feature unterstützen. Wenn der Anwender Text in eine TextBox mit aktiviertem AutoPostBack eingibt und anschließend das Feld verlässt, etwa durch Drücken der Tabulator- oder Enter-Taste, wird das Formular automatisch zum Server gesandt. Dieses Feature ist immer dann sinnvoll, wenn nach einer Eingabe das Formular ohnehin zum Server gesandt werden soll. Auf diese Weise ersparen Sie dem Anwender den Klick auf den OK-Button.


Achtung   Das AutoPostBack-Feature wird im Browser über eine JavaScript-Routine realisiert. Bei deaktiviertem JavaScript kann es nicht funktionieren. Daher sollten Sie stets auch einen OK-Button zur Verfügung stellen. Bei deaktiviertem JavaScript wäre die Verwendung des Formulars sonst unmöglich.

Das folgende Formular enthält ein einzeiliges Eingabefeld für den Anwendernamen, ein Passwortfeld und ein mehrzeiliges Feld für einen Kommentar. Das AutoPostBack-Feature wurde bei allen drei Eingabefeldern aktiviert. Das ergibt in diesem Zusammenhang keinen tieferen Sinn, verdeutlicht aber beim Testen die Funktionsweise. Abbildung 8.5 zeigt die Darstellung im Browser.

<!-- webserver_textbox01.aspx -->
<%@ Page Language="VB" debug="True" Strict="True" %>
<script runat="server">
Sub Page_Load (Sender As Object, E As EventArgs)
   ausgabe.text = ""
   ausgabe.text &= "Name: " & textEinzeilig.text 
   ausgabe.text &= "<br>"
   ausgabe.text &= "Passwort: " & textPasswort.text
   ausgabe.text &= "<br>"
   ausgabe.text &= "Kommentar: " & textMehrzeilig.text
End Sub
</script>
<html><head>
<title>Webserversteuerelemente: TextBox</title>
</head>
<body>
    <h3>Webserversteuerelemente: TextBox</h3>
    <form runat="server" id="myForm">
Ihr Name<br>
<asp:TextBox id="textEinzeilig"
       Columns="40"
       MaxLength="40"
       Rows="1"
       TextMode="SingleLine"
       runat="server"
       AutoPostBack="True"/><br>
Ihr Passwort<br>
<asp:TextBox id="textPasswort"
       Columns="40"
       MaxLength="40"
       Rows="1"
       TextMode="Password"
       runat="server"
       AutoPostBack="True"/><br>
Ihr Kommentar<br>
<asp:TextBox id="textMehrzeilig"
       Columns="40"
       Rows="5"
       TextMode="Multiline"
       Wrap="True"
       runat="server"
       AutoPostBack="True"/>
<br>
<asp:Button
       id="btnSubmit"
       runat="server"
       Text ="   OK   "/>
<p>
<asp:Label
       id="ausgabe" 
       Text ="" 
       runat="server"/>
</p>          
</form></body></html>

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 8.5 Durch das automatische Postback erhält jeweils stets die OK-Schaltfläche den Fokus.

Nach der Eingabe von Text versenden alle drei Eingabefelder automatisch das Formular. Bei jedem Laden der Seite schreibt die Prozedur Page_Load die aktuellen Inhalte der drei Eingabefelder in ein Label-Feld hinter das Formular.

Das AutoPostBack-Feature funktioniert beim Testen des Beispiels wunschgemäß. Bei der Eingabe des Passwortes fällt das besondere Verhalten des Passwortfelds auf. Beim automatischen Formularversand bleibt der Inhalt des Passwortfelds nicht erhalten, sondern wird aus dem Feld gelöscht. Auf diese Weise soll ein Missbrauch verhindert werden. Beim übernächsten PostBack verschwindet dabei natürlich auch wieder das Passwort aus dem Label-Feld, weil im Passwortfeld nichts mehr drinsteht.

Unangenehm fällt aber auf, dass nach dem automatischen Versand stets der OK-Button den Fokus bekommt und nicht das jeweils nächste Eingabefeld, in das der Anwender die folgende Eingabe machen möchte. Dieses Verhalten resultiert aus der clientseitigen JavaScript-Routine. Offenkundig bewirkt ein submit stets gleichzeitig, dass auch der Submit-Button den Fokus erhält.

Dieser Nebeneffekt der AutoPostBack-Funktion ist jedoch wenig anwenderfreundlich. Es stellt sich die Frage, ob und wie man den Cursor jeweils in das richtige Feld stellen kann. Beim Durchsehen der Dokumentation stellt man aber fest, dass das TextBox-Steuerelement keine Methode zur Fokus-Steuerung anbietet. Auch die grundlegende Klasse System.Web.UI.Control hat keine Fokus-bezogenen Merkmale im Gepäck.


Achtung   Dies ist einer der zahlreichen Unterschiede zu den Klassen von Windows.Forms. Die Basisklasse System.Windows.Forms.Control beispielsweise bietet bereits alle Eigenschaften und Methoden, um den Fokus von Steuerelementen beeinflussen zu können. Bei der ASP.NET-Programmierung müssen Sie auf dieses nützliche Feature entweder verzichten oder eben selbst zur Tastatur greifen und das gewünschte Verhalten mit Hilfe von selbst geschriebenem JavaScript-Code ergänzen.


Galileo Computing

8.9.1 Mit JavaScript den Fokus setzen  toptop

Als kleinen Exkurs habe ich das einmal umgesetzt und bin zu folgendem Ergebnis gekommen:

<!-- webserver_textbox02.aspx -->
<%@ Page Language="VB" debug="True" Strict="True" %>
<script runat="server">
Dim min As Integer = 1
Dim max As Integer = 4
Dim neu as Short = 1

Sub Page_Load (Sender As Object, E As EventArgs)
   ausgabe.text = ""
   ausgabe.text &= "Name: " & textEinzeilig.text 
   ausgabe.text &= "<br>"
   ausgabe.text &= "Passwort: " & textPasswort.text
   ausgabe.text &= "<br>"
   ausgabe.text &= "Kommentar: " & textMehrzeilig.text
End Sub
          
Sub changing (sender As Object, e As EventArgs)
Dim tb as New TextBox()
   tb = CType (sender, TextBox) 
   neu = tb.TabIndex + CType(1, Short)
End Sub

</script>
<script language="JavaScript" type="text/javascript">
<!--
function setzeFokus (inZiel) {
   switch (inZiel) {
      case 1:
         document.myForm.textEinzeilig.focus();
         break;
      case 2:
         document.myForm.textPasswort.focus();
         break;
      case 3:
         document.myForm.textMehrzeilig.focus();
         break;
      case 4:
         document.myForm.ausgabe.focus();
         break;
   }
}
//-->
</script>
<html><head>
<title>Webserversteuerelemente: TextBox</title>
</head>
<body onLoad="setzeFokus(<% = neu %>)">
    <h3>Webserversteuerelemente: TextBox</h3>
    <form runat="server" id="myForm">
Ihr Name<br>
<asp:TextBox id="textEinzeilig"
       Columns="40"
       MaxLength="40"
       Rows="1"
       TextMode="SingleLine"
       OnTextChanged="changing"
       runat="server"
       AutoPostBack="True"
       TabIndex="1"/><br>
Ihr Passwort<br>
<asp:TextBox id="textPasswort"
       Columns="40"
       MaxLength="40"
       Rows="1"
       TextMode="Password"
       OnTextChanged="changing"
       runat="server"
       AutoPostBack="True"
       TabIndex="2"/><br>
Ihr Kommentar<br>
<asp:TextBox id="textMehrzeilig"
       Columns="40"
       Rows="5"
       TextMode="Multiline"
       Wrap="True"
       OnTextChanged="changing"
       runat="server"
       AutoPostBack="True"
       TabIndex="3"/>
<br>
<asp:Button
       id="btnSubmit"
       runat="server"
       Text ="OK" 
       TabIndex="4"/>
<p>
<asp:Label
       id="ausgabe" 
       Text ="" 
       runat="server"/>
</p>          
</form></body></html>

Wenn diese Seite im Browser geladen wird, wird über das onLoad-Attribut im Body-Element die JavaScript-Funktion setzeFokus aufgerufen. Dabei erhält diese Funktion einen Parameter, der jeweils dafür sorgt, dass genau das richtige Steuerelement den Fokus bekommt. Dieser Wert wird über den klassischen Inline-Code eingefügt:

<body onLoad="setzeFokus(<% = neu %>)">

ASP.NET hat seinerseits dafür gesorgt, dass die Variable neu den richtigen Wert enthält, und das kommt so:

Beim ersten Aufruf der Seite bekommt die Variable neu den Wert 1 zugewiesen.

Bei einem Postback wird die serverseitige Prozedur changing aufgerufen. Dafür sorgt bei den asp:TextBox-Elementen jeweils das Attribut OnTextChanged="changing". Die Prozedur changing ermittelt den Wert des Attributs TabIndex, über den dasjenige Steuerelement verfügt, das den Aufruf von changing veranlasst hat, erhöht diesen Wert um 1 und weist der Variablen neu den erhöhten Wert zu.

changing kennt mit sender zunächst nur eine Variable vom Typ Object. Da sichergestellt ist, dass die Prozedur stets von einem TextBox-Element aufgerufen wird, kann problemlos die Konvertierung in ein TextBox-Objekt erfolgen:

tb = CType (sender, TextBox)

Mit tb.TabIndex kann der Wert des TabIndex-Attributs abgerufen werden. Die Erhöhung um 1 erfordert einen auf den ersten Blick ungewöhnlichen Aufwand:

neu = tb.TabIndex + CType(1, Short)

Der Ausdruck CType(1, Short) stellt die Zahl 1 in eine Short-Darstellung um. Zahlen, die als Literal angegeben werden, sind unter .NET per definitionem vom Typ Integer. Da aber in der Page-Direktive das Attribut Strict="True" angegeben ist, dürfen bei impliziten Typkonvertierungen keine Typeinengungen stattfinden. Genau das wäre aber der Fall, wenn man beispielsweise neu = tb.TabIndex + 1 schreiben würde, denn neu ist vom Typ Short und das Literal 1 wäre vom Typ Integer. Also muss ausdrücklich konvertiert werden. Und warum ist neu vom Typ Short? Weil die Eigenschaft TabIndex von diesem Typ ist.

Im Prinzip wird hier also mit der serverseitigen Programmierung der clientseitige Code beeinflusst.

  

Einstieg in VB.NET

VB.NET

Einstieg in C#

Visual C#

VB.NET und Datenbanken

Einstieg in XML




Copyright © Galileo Press GmbH 2003
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de