Freigeben über


Beispiel für ein zusammengesetztes Serversteuerelement

Im folgenden Beispiel wird die Entwicklung eines zusammengesetzten Steuerelements (Composite) beschrieben, das vier ASP.NET-Serversteuerelemente kombiniert: zwei Textbox-Steuerelemente, ein Label-Steuerelement und ein Button-Steuerelement. Sobald auf das untergeordnete Button-Steuerelement geklickt wird, vergleicht Composite die Summe der in den Textfeldern eingegebenen Zahlen mit einem vorher festgelegten Wert (benutzerdefinierte Eigenschaft) und löst ein benutzerdefiniertes Ereignis aus. Außerdem wird die Text-Eigenschaft des untergeordneten Label-Steuerelements als Eigenschaft der obersten Ebene offen gelegt.

Beachten Sie, dass die untergeordneten Steuerelemente eines zusammengesetzten Steuerelements eingekapselt werden. Standardmäßig sind sie außerhalb des übergeordneten Elements nicht sichtbar. (Der Entwickler könnte versuchen, über die Controls-Auflistung des übergeordneten Elements auf die untergeordneten Steuerelemente Zugriff zu erhalten. Allerdings könnten dazwischenliegende literale Steuerelemente den Zugang zum Index eines bestimmten untergeordneten Steuerelements erschweren.)

Sie können bei einem zusammengesetzten Steuerelement frei entscheiden, welche untergeordneten Steuerelemente als Eigenschaft offen gelegt werden und welche Eigenschaften und Ereignisse seiner untergeordneten Steuerelemente als Eigenschaften und Ereignisse der obersten Ebene offen gelegt werden. Werden durch ein zusammengesetztes Steuerelement Eigenschaften aus untergeordneten Steuerelementen synthetisiert, geschieht dies einfach durch Delegation an das untergeordnete Steuerelement, wie im folgenden Beispiel dargestellt.

// Delegate to label, which is an instance of
// System.Web.UI.WebControls.Label.
public string Text
            {
                  get
                  {
                    EnsureChildControls();
                        return label.Text;
                  }
                  set
                  {
                    EnsureChildControls();
                        label.Text = value;
                  }
            }

Composite legt die folgenden öffentlichen Eigenschaften offen:

  • Number

    Eine benutzerdefinierte Eigenschaft, mit deren Hilfe Entwickler eine Zahl festlegen können.

  • Text

    Eine Eigenschaft, die aus der Text-Eigenschaft des untergeordneten Label-Steuerelements synthetisiert wurde.

Composite legt das folgende öffentlichen Ereignis offen:

  • Check

    Ein benutzerdefiniertes Ereignis, das ausgelöst wird, wenn Composite die Summe der beiden Zahlen in den Textfeldern mit dem Wert von Number vergleicht. Das Check-Ereignis benötigt den benutzerdefinierten Ereignisdelegaten CheckEventHandler sowie CheckEventArgs, die entsprechende Klasse für Ereignisdaten. Weitere Informationen zum Definieren eines benutzerdefinierten Ereignisses finden Sie unter Definieren eines Ereignisses.

Beachten Sie auch die folgenden Funktionen des Composite-Steuerelements:

  • Composite erstellt seine untergeordneten Steuerelemente weder in OnInit noch in seinem Konstruktor, sondern in der CreateChildControls-Methode.
  • Composite legt das Click-Ereignis seines untergeordneten Button-Steuerelements nicht offen. Stattdessen behandelt es das Click-Ereignis und löst das benutzerdefinierte Check-Ereignis aus. Wenn ein zusammengesetztes Steuerelement Ereignisse behandelt, die durch untergeordnete Steuerelemente ausgelöst wurden, müssen die Ereignishandler in CreateChildControls verknüpft werden.
  • Composite implementiert InamingContainer, um ein Postback-Ereignis an das untergeordnete Button-Steuerelement weiterzuleiten.

Beachten Sie, dass Sie Ereignisse von untergeordneten Steuerelementen bis zum Container weiterleiten und dort als Ereignisse der obersten Ebene offen legen können. Weitere Informationen finden Sie unter Bubbling eines Ereignisses und Beispiel für Ereignisbubbling anhand eines Steuerelements.

Es folgt ein Codebeispiel für das zusammengesetzte Steuerelement. Eine Anleitung zum Erstellen des Beispiels finden Sie unter Beispiele für Serversteuerelemente.

// Composite.cs.
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomControls 
{
      
      public class Composite : Control, INamingContainer 
      {
            private int number = 100;
            private Label label;
            
            public int Number
            {
                  get
                  {
                        return number;
                  }
                  set
                  {
                        number = value;
                  }
            }
            
            private int Sum
            {
                  get 
                  {
                        EnsureChildControls();
                        return Int32.Parse(((TextBox)Controls[1]).Text) + 
                              Int32.Parse(((TextBox)Controls[4]).Text);
                  }
                  
            }

            public string Text
            {
                  get
                  {
                    EnsureChildControls();
                        return label.Text;
                  }
                  set
                  {
                    EnsureChildControls();
                        label.Text = value;
                  }
            }
            
            
            public event CheckEventHandler Check;
            
            protected virtual void OnCheck(CheckEventArgs ce)
            {
                  if (Check != null)
                  {
                        Check(this,ce);
                  }
            }
            
            protected override void CreateChildControls() 
            {
                  
                  Controls.Add(new LiteralControl("<h3>Enter a number : "));
                  
                  TextBox box1 = new TextBox();
                  box1.Text = "0";
                  Controls.Add(box1);
                  
                  Controls.Add(new LiteralControl("</h3>"));
                  
                  Controls.Add(new LiteralControl("<h3>Enter another number : "));
                  
                  TextBox box2 = new TextBox();
                  box2.Text = "0";
                  Controls.Add(box2);
                  
                  Controls.Add(new LiteralControl("</h3>"));
                  
                  Button button1 = new Button();
                  button1.Text = "Submit";
                  Controls.Add(new LiteralControl("<br>"));
                  Controls.Add(button1);
                  button1.Click += new EventHandler(this.ButtonClicked);
                  
                  Controls.Add(new LiteralControl("<br><br>"));
                  label = new Label();
                  label.Height = 50;
                  label.Width = 500;
                  label.Text = "Click the button to see if you won.";
                  Controls.Add(label);
                  
            }
            
            protected override void OnPreRender(EventArgs e)
            {
                  ((TextBox)Controls[1]).Text = "0";
                  ((TextBox)Controls[4]).Text = "0";
            }
            
            private void ButtonClicked(Object sender, EventArgs e)
            {
                  OnCheck(new CheckEventArgs(Sum - Number));
            }
      }
}

// 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]
' Composite.vb.
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls


Namespace CustomControls
   Public Class Composite
      Inherits Control
      Implements INamingContainer
      Private _number As Integer = 100
      Private label As Label
      
      Public Property Number() As Integer
         Get
            Return _number
         End Get
         Set
            _number = value
         End Set
      End Property
      
      Private ReadOnly Property Sum() As Integer
         Get
            EnsureChildControls()
            Return Int32.Parse(CType(Controls(1), TextBox).Text) + Int32.Parse(CType(Controls(4), TextBox).Text)
         End Get
      End Property
      
      Public Property Text() As String
         Get
            EnsureChildControls()
            Return label.Text
         End Get
         Set
            EnsureChildControls()
            label.Text = value
         End Set
      End Property
      
      Public Event Check As CheckEventHandler
      
      Protected Overridable Sub OnCheck(ce As CheckEventArgs)
         RaiseEvent Check(Me, ce)
      End Sub
      
      Protected Overrides Sub CreateChildControls()
         
         Controls.Add(New LiteralControl("<h3>Enter a number : "))
         
         Dim box1 As New TextBox()
         box1.Text = "0"
         Controls.Add(box1)
         
         Controls.Add(New LiteralControl("</h3>"))
         
         Controls.Add(New LiteralControl("<h3>Enter another number : "))
         
         Dim box2 As New TextBox()
         box2.Text = "0"
         Controls.Add(box2)
         
         Controls.Add(New LiteralControl("</h3>"))
         
         Dim button1 As New Button()
         button1.Text = "Submit"
         Controls.Add(New LiteralControl("<br>"))
         Controls.Add(button1)
         AddHandler button1.Click, AddressOf Me.ButtonClicked
         
         Controls.Add(New LiteralControl("<br><br>"))
         label = New Label()
         label.Height = Unit.Pixel(50)
         label.Width = Unit.Pixel(500)
         label.Text = "Click the button to see if you won."
         Controls.Add(label)
      End Sub
      
      Protected Overrides Sub OnPreRender(e As EventArgs)
         CType(Controls(1), TextBox).Text = "0"
         CType(Controls(4), TextBox).Text = "0"
      End Sub
      
      Private Sub ButtonClicked(sender As [Object], e As EventArgs)
         OnCheck(New CheckEventArgs(Sum - Number))
      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 eines zusammengesetzten Steuerelements auf einer Seite

Im folgenden Beispiel wird das zusammengesetzte Steuerelement Composite auf einer ASP.NET-Seite verwendet.

<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>
<html>
<script language="VB" runat=server>
   Private Sub Sum_Checked(sender As Object, e As CheckEventArgs)
      If e.Match = True Then
         Composite.Text = "<h2> You won a million dollars.!!!! </h2>"
      Else
         Composite.Text = "Sorry, try again. The numbers you entered don't add up to" _
            & " the hidden number."
      End If
   End Sub 
</script>
            
<body>

<h1> The Mystery Sum Game </h1><br>
                  
<form runat=server>                             
<Custom:Composite id = "Composite" OnCheck = "Sum_Checked" Number= "10" runat = server/>                                                                          
</form>                                               
</body>                                         
</html>

Siehe auch

Vergleich von zusammengesetzten Steuerelementen und Benutzersteuerelementen | Vergleich von Komposition und Wiedergabe | Bubbling eines Ereignisses | Beispiel für Ereignisbubbling anhand eines Steuerelements