Vergleich von Komposition und Wiedergabe
Das Verfassen eines zusammengesetzten Steuerelements ist zwar relativ einfach, doch erfordert die Komposition einen gewissen Aufwand, da untergeordnete Steuerelemente erstellt werden müssen. Wenn Sie die Leistung des Steuerelements optimieren möchten, können Sie die Wiedergabelogik durch Überschreiben der Render-Methode selbst implementieren. Zusätzlich müssen Sie die vom Steuerelement benötigte Postback-Datenverarbeitung und Postback-Ereignisbehandlung implementieren.
Das folgende Beispiel zeigt das Steuerelement Rendered
, das für die Darstellung einer mit dem Beispiel für ein zusammengesetztes Serversteuerelement identischen Benutzeroberfläche sorgt. Rendered
setzt hierfür keine Komposition ein und ist daher schwieriger zu verfassen.
Die folgenden Member in Rendered
entsprechen denen im Beispiel für ein zusammengesetztes Serversteuerelement:
- Die öffentliche
Text
-Eigenschaft. (In diesem Fall wird die Eigenschaft jedoch nicht an ein untergeordnetes Steuerelement delegiert.) - Die öffentliche
Number
-Eigenschaft. - Die private
Sum
-Eigenschaft. - Das benutzerdefinierte
Check
-Ereignis.
Da Rendered
nicht über untergeordnete Steuerelemente verfügt, muss es zusätzlich folgende Aufgaben übernehmen:
- Bereitstellen einer eigenen Implementierung für die Textfelder.
- Bereitstellen einer eigenen Implementierung für eine Schaltfläche zum Senden.
- Implementieren von IPostBackEventHandler.
- Implementieren von IPostBackDataHandler.
- Überschreiben der Render-Methode.
Beachten Sie, dass Rendered
nicht auf ViewState zum Erhalten von Eigenschaften bei Schleifen zurückgreift, da in diesem Szenario keine Zustandswiederherstellung benötigt wird. Beachten Sie ferner, dass in diesem Beispiel die Render-Methode unformatierten HTML-Code in die Write-Methode von HtmlTextWriter schreibt. Ein Beispiel für den Einsatz der Dienstprogrammmethoden von HtmlTextWriter zur Darstellung finden Sie unter Beispiele für die Darstellung eines Serversteuerelements.
Eine Anleitung zum Erstellen des Beispiels finden Sie unter Beispiele für Serversteuerelemente.
using System;
using System.Web;
using System.Web.UI;
using System.Collections.Specialized;
namespace CustomControls
{
public class Rendered : Control, IPostBackDataHandler, IPostBackEventHandler
{
private String text1;
private String text2;
private String text = "Press the button to see if you won.";
private int number = 100;
private int Sum
{
get
{
return Int32.Parse(text1) +
Int32.Parse(text2);
}
}
public int Number
{
get
{
return number;
}
set
{
number = value;
}
}
public String Text {
get {
return text;
}
set {
text = value;
}
}
public event CheckEventHandler Check;
protected virtual void OnCheck(CheckEventArgs ce)
{
if (Check != null)
{
Check(this,ce);
}
}
public virtual bool LoadPostData(string postDataKey,
NameValueCollection values) {
text1 = values[UniqueID + "t1"];
text2 = values[UniqueID+ "t2"];
Page.RegisterRequiresRaiseEvent(this);
return false;
}
public virtual void RaisePostDataChangedEvent() {
}
public void RaisePostBackEvent(string eventArgument){
OnCheck(new CheckEventArgs(Sum - Number));
}
protected override void Render(HtmlTextWriter output) {
output.Write ("<h3>Enter a number : ");
output.Write("<INPUT type= text name = " + this.UniqueID + "t1" +
" value = '0' >");
output.Write("</h3><br>");
output.Write ("<br><h3>Enter another number : ");
output.Write("<INPUT type= text name = " + this.UniqueID + "t2" +
" value = '0' >");
output.Write("</h3><br>");
output.Write("<br><br><input type= submit name = " +
this.UniqueID + " value= 'Submit'>");
output.Write("<br><br><span style='height:50px;width:500px;'>"
+ Text + "</span>");
}
}
}
// CheckEvent.cs.
// Contains the code for the custom event data class CheckEventArgs.
// Also defines the event handler for the Check event.
using System;
namespace CustomControls
{
public class CheckEventArgs : EventArgs
{
private bool match = false;
public CheckEventArgs (int difference)
{
if (difference == 0)
{
match = true;
}
}
public bool Match
{
get
{
return match;
}
}
}
public delegate void CheckEventHandler(object sender, CheckEventArgs ce);
}
[Visual Basic]
Option Explicit
Option Strict
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Collections.Specialized
Namespace CustomControls
Public Class Rendered
Inherits Control
Implements IPostBackDataHandler, IPostBackEventHandler
Private text1 As String
Private text2 As String
Private _text As String = "Press enter to see if you won."
Private _number As Integer = 100
Private ReadOnly Property Sum() As Integer
Get
Return Int32.Parse(text1) + Int32.Parse(text2)
End Get
End Property
Public Property Number() As Integer
Get
Return _number
End Get
Set
_number = value
End Set
End Property
Public Property Text() As String
Get
Return _text
End Get
Set
_text = value
End Set
End Property
Public Event Check As CheckEventHandler
Protected Overridable Sub OnCheck(ce As CheckEventArgs)
RaiseEvent Check(Me, ce)
End Sub
Public Overridable Function LoadPostData(postDataKey As String, values As NameValueCollection) As Boolean Implements IPostBackDataHandler.LoadPostData
text1 = values(UniqueID & "t1")
text2 = values(UniqueID & "t2")
Page.RegisterRequiresRaiseEvent(Me)
Return False
End Function
Public Overridable Sub RaisePostDataChangedEvent() Implements IPostBackDataHandler.RaisePostDataChangedEvent
End Sub
Public Sub RaisePostBackEvent(eventArgument As String) Implements IPostBackEventHandler.RaisePostBackEvent
OnCheck(New CheckEventArgs(Sum - Number))
End Sub
Protected Overrides Sub Render(output As HtmlTextWriter)
output.Write("<h3>Enter a number : ")
output.Write("<INPUT type= text name = " & _
Me.UniqueID & "t1" & _
" value = '0' >")
output.Write("</h3><br>")
output.Write("<br><h3>Enter another number : ")
output.Write("<INPUT type= text name = " & _
Me.UniqueID & "t2" & _
" value = '0' >")
output.Write("</h3><br>")
output.Write("<br><br><input type= submit name = " & _
Me.UniqueID & _
" value= 'Submit'>")
output.Write("<br><br><span style='height:50px;width:500px;'>" & _
Text & "</span>")
End Sub
End Class
End Namespace
' CheckEvent.vb
' Contains the code for the custom event data class CheckEventArgs.
' Also defines the event handler for the Check event.
Imports System
Namespace CustomControls
Public Class CheckEventArgs
Inherits EventArgs
Private _match As Boolean = False
Public Sub New(difference As Integer)
If difference = 0 Then
_match = True
End If
End Sub
Public ReadOnly Property Match() As Boolean
Get
Return _match
End Get
End Property
End Class
Public Delegate Sub CheckEventHandler(sender As Object, ce As CheckEventArgs)
End Namespace
Verwenden des Steuerelements "Rendered" auf einer Seite
Im folgenden Beispiel wird das benutzerdefinierte Steuerelement Rendered
eingesetzt, das im vorangegangenen Beispiel definiert wurde. Beachten Sie, dass diese Seite exakt mit der Seite im Beispiel für ein zusammengesetztes Serversteuerelement übereinstimmt. Der einzige Unterschied besteht darin, dass dort ein zusammengesetztes statt eines gerenderten Steuerelements verwendet wird.
<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>
<script language="VB" runat=server>
Private Sub Sum_Checked(sender As Object, e As CheckEventArgs)
If e.Match = True Then
Rendered.Text = "<h2> You won a million dollars!!!! </h2>"
Else
Rendered.Text = "Sorry, try again. The numbers you entered don't add up to" & _
" the hidden number."
End If
End Sub
</script>
<html>
<body>
<h1> The Mystery Sum Game </h1><br>
<form runat=server>
<Custom:Rendered id = "Rendered" OnCheck = "Sum_Checked" Number= "10" runat = server/>
</form>
</body>
</html>