8.12 Webserversteuerelemente für Tabellen
 
| Klassen
|
System.Web.UI.WebControls.Table
System.Web.UI.WebControls.TableCell
System.Web.UI.WebControls.TableRow
|
| Deklaration
|
<asp:Table id="Table1"
BackImageUrl="url"
CellSpacing="cellspacing"
CellPadding="cellpadding"
GridLines="None|Horizontal|Vertical|Both"
HorizontalAlign=
"Center|Justify|Left|NotSet|Right"
runat="server">
<asp:TableRow>
<asp:TableCell>
Cell text
</asp:TableCell>
</asp:TableRow>
</asp:Table>
|
| Erzeugter HTML-Code
|
Normaler HTML-Code unter Verwendung der üblichen Elemente TABLE, TR und TD
|
| Kurzcharakteristik
|
Die Webserversteuerelemente für Tabellen bieten die serverseitigen Entsprechungen für die allseits bekannten Tabellenelemente von HTML.
|
Beim Erstellen einfacher HTML-Dateien bereitet die Verwendung der bekannten HTML-Elemente TABLE, TR und TD wahrscheinlich weniger Mühe als der Einsatz der entsprechenden Webserversteuerelemente. Der primäre Einsatzzweck der Tabellen-Steuerelemente liegt darin, dass Sie im Rahmen von .NET-Code die Tabellen leichter dynamisch zusammensetzen können.
webserver_table01.aspx zeigt ein entsprechendes Beispiel: Der Anwender gibt die gewünschte Anzahl von Zeilen und Spalten ein und eine Skript-Routine erstellt eine entsprechende Tabelle. Die Zellen werden fortlaufend nummeriert, und damit die Tabelle nicht so langweilig wird, erhält jede Zelle eine per Zufallsgenerator erzeugte Hintergrundfarbe. Abbildung 8.7 zeigt das Ergebnis im Browser.
<!-- webserver_table01.aspx -->
<% @Page Language="VB" debug="True" Strict="True" %>
<% @Import Namespace="System.Drawing" %>
<% @Import Namespace="System.Random" %>
<script runat="server" >
dim zufall as New System.Random()
Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
If Page.IsPostBack Then
Dim numSpalten As Integer = _
CType(anzahlSpalten.text, Integer)
Dim numZeilen As Integer = _
CType(anzahlZeilen.text, Integer)
Dim i As Integer
Dim k As Integer
Dim zaehler as integer = 1
' Tabelle erstellen und dem Ausgabepanel zuweisen
Dim eineTabelle as new Table()
ausgabe.Controls.Add(eineTabelle)
eineTabelle.GridLines = GridLines.Both
eineTabelle.BorderWidth = Unit.Pixel(1)
For i = 1 to numZeilen
' eine neue Reihe erstellen und der Tabelle
' zuweisen
Dim eineReihe as TableRow = New TableRow()
eineTabelle.Rows.Add (eineReihe)
For k = 1 to numSpalten
' eine neue Zelle erstellen und der Reihe
' zuweisen
Dim eineZelle As New TableCell()
eineReihe.Cells.Add (eineZelle)
' den Zelleninhalt gestalten
Dim lbl as Label = new Label()
eineZelle.Controls.Add(lbl)
lbl.text = CType (zaehler, String)
zaehler += 1
eineZelle.BackColor = getZufallsFarbe ()
Next
Next
End If
End Sub
Function getZufallsFarbe () As System.Drawing.Color
Dim min As Integer = 0
Dim max As Integer = 255
Dim r As Integer = zufall.next (min, max)
dim g As Integer = zufall.next (min, max)
dim b As Integer = zufall.next (min, max)
return System.Drawing.Color.FromArgb (r,g,b)
End Function
</script>
<html><head>
<title>Webserversteuerelemente: Tabellen</title>
</head><body>
<h3>Bunte Tabellen zu verschenken</h3>
<form runat="server" id="myForm">
Wie viele Spalten soll die Tabelle haben?
<asp:TextBox type="SingleLine" runat="server"
Columns="2"
MaxLength="2"
id="anzahlSpalten" />
<br>
Wie viele Zeilen soll die Tabelle haben?
<asp:TextBox type="SingleLine" runat="server"
Columns="2"
MaxLength="2"
id="anzahlZeilen" />
<br><br>
<asp:Button id="btnOK" runat="server"
Text=" OK " />
<br><br>
<asp:Panel id="ausgabe" runat="server"
Width="50%" />
</form></body></html>
 Hier klicken, um das Bild zu Vergrößern
Abbildung 8.7 Die Hintergrundfarben werden mit einem Zufallsgenerator erzeugt.
Der HTML-Teil des Skripts definiert lediglich die beiden Eingabefelder, den OK-Button und ein zunächst noch leeres Panel. Bei der Eingabe der gewünschten Spalten- und Zeilenanzahl wird die maximale Länge auf zwei Zeichen beschränkt, um Monster-Tabellen zu vermeiden.
Beim Versenden des Formulars wird die Page_Load-Prozedur ausgeführt. Nach der Eingabe trifft die Bedingung IsPostBack zu und die Tabellenfabrik beginnt mit der Arbeit.
Da die Seite die Anweisung Strict="True" beinhaltet, müssen die eingegebenen Werte zunächst in einen Integer-Typ konvertiert werden.
Dim numSpalten As Integer = _
CType(anzahlSpalten.text, Integer)
Dim numZeilen As Integer = _
CType(anzahlZeilen.text, Integer)
Die Tabelle wird erstellt und dem Ausgabe-Panel hinzugefügt.
Dim eineTabelle as new Table()
ausgabe.Controls.Add(eineTabelle)
Einige Tabelleneigenschaften werden gesetzt. Der GridLines-Eigenschaft wird ein Wert aus der GridLines-Enumeration zugewiesen.
eineTabelle.GridLines = GridLines.Both
Um die Randstärke angeben zu können, benötigen Sie für die Eigenschaft BorderWidth ein Objekt vom Typ Unit. Mit der statischen Funktion Pixel() der Klasse Unit erstellen Sie ein entsprechendes Objekt mit der gewünschten Pixelzahl.
eineTabelle.BorderWidth = Unit.Pixel(1)
Zwei verschachtelte For-Schleifen erstellen zunächst die Reihen ...
Dim eineReihe as TableRow = New TableRow()
eineTabelle.Rows.Add (eineReihe)
... und dann die Zellen.
Dim eineZelle As New TableCell()
eineReihe.Cells.Add (eineZelle)
Die Add-Methode fügt der jeweiligen Collection Rows beziehungsweise Cells das neu erzeugte Objekt hinzu. Den Zellen selbst wird ein Label-Objekt mit fortlaufender Nummerierung zugewiesen. Für die Definition der Hintergrundfarbe verfügt das Skript über die selbst geschriebene Funktion getZufallsFarbe(). Diese Funktion liefert das benötigte Objekt vom Typ System.Drawing.Color zurück. Drei zufällige Werte zwischen 0 und 255 erzeugen mit Hilfe der Funktion System.Drawing.Color.FromArgb das gewünschte Objekt.
Das zufall-Objekt selbst wird nicht innerhalb der Funktion getZufallsFarbe erzeugt, sondern außerhalb der Prozeduren. Wenn Sie die Zeile
dim zufall as New System.Random()
in die Prozedur getZufallsFarbe() selbst hineinlegen, werden Sie die merkwürdige Erfahrung machen, dass die Tabellenzellen fast alle die gleiche Farbe bekommen. Die Ursache dafür dürfte darin zu suchen sein, dass Zufallszahlengeneratoren immer irgendwelche Zeitangaben verarbeiten, um einen Startwert zu bekommen. Wenn Sie das System.Random-Objekt in der Funktion stets neu erzeugen, dann scheint die Ausgangsposition für dieses Zufallsobjekt zu ordentlich zu sein, als dass es genügend Unordnung erzeugen könnte. Wenn Sie das System.Random-Objekt aber statt dessen außerhalb der Prozedur definieren und nur einmal initialisieren, bleibt dem Objekt offenkundig genügend Zeit, um mächtig Unordnung zu erzeugen. Jedenfalls kann ich mir das Phänomen nicht anders erklären.
Zwei Zeilen ganz am Anfang des Skripts sollen noch erwähnt werden:
<% @Import Namespace="System.Drawing" %>
<% @Import Namespace="System.Random" %>
Diese beiden Namespaces müssen Sie eigens importieren, um die enthaltenen Klassen im Skript verwenden zu können.
| Tipp Bevor Sie ein entsprechendes Beispiel produktiv einsetzen, sollten Sie einmal einen Blick auf den erzeugten Quellcode werfen. Den größten Teil des Quellcodes macht das Viewstate-Feld aus, das in Kapitel 11, der Status von Seiten, Sitzungen und Applikationen, näher vorgestellt wird. Für dieses Beispiel sind aber die Viewstate-Informationen nicht erforderlich. Daher sollten Sie in der Page-Direktive zusätzlich das Attribut EnableviewState="False" angeben. Anschließend sind die erzeugten HTML-Seiten nur noch halb so groß.
|
|