Freigeben über


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>
                                  

Siehe auch

Entwickeln eines zusammengesetzten Steuerelements