Partager via


Exemple de contrôle serveur composite

L'exemple suivant développe un contrôle composite (Composite) qui combine quatre contrôles serveur ASP.NET : deux contrôles Textbox, un contrôle Label et un contrôle Button. Lorsqu'un clic a été effectué sur son contrôle Button enfant, Composite vérifie si la somme des deux nombres entrés dans les zones de texte est égale à un nombre spécifié (défini dans une colonne personnalisée), puis déclenche un événement personnalisé. Il expose aussi la propriété Text de son contrôle Label enfant en tant que propriété de niveau supérieur.

Remarquez que les contrôles enfants d'un contrôle composite sont encapsulés. Par défaut, ils ne sont pas visibles à l'extérieur du parent. (Un développeur de pages pourrait essayer d'accéder aux contrôles enfants à l'aide de la collection Controls de leur parent, mais en raison des contrôles littéraux impliqués, il pourrait s'avérer difficile d'obtenir l'index d'un contrôle enfant déterminé.)

Un contrôle composite peut décider d'exposer un contrôle enfant en tant que propriété, et choisir également les propriétés et événements de ces contrôles enfants qu'il souhaite exposer comme propriétés et événements de niveau supérieur. Lorsqu'un contrôle composite synthétise des propriétés provenant de ces contrôles enfants, il délègue simplement à ceux-ci, comme le montre l'exemple suivant.

// 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 expose les propriétés publiques suivantes.

  • Number

    Propriété personnalisée qui permet à un développeur de pages de spécifier un nombre.

  • Text

    Propriété synthétisée à partir de la propriété Text du contrôle Label enfant.

Composite expose l'événement personnalisé suivant.

  • Check

    Événement personnalisé qui est déclenché lorsque Composite vérifie si la somme de deux nombres dans les zones de texte est égale à la valeur de Number. L'événement Check exige le délégué d'événement personnalisé, CheckEventHandler, et la classe correspondante des données d'événement, CheckEventArgs. Pour plus d'informations sur la définition d'un événement personnalisé, consultez Définition d'un événement.

Remarquez également les fonctionnalités suivantes du contrôle Composite.

  • Composite crée ses contrôles enfants dans la méthode CreateChildControls; et non dans OnInit ou dans son constructeur.
  • Composite n'expose pas l'événement Click de son contrôle enfant Button. Il gère plutôt l'événement Click et déclenche l'événement personnalisé Check. Si un contrôle composite gère des événements déclenchés par ses contrôles enfants, il doit connecter les gestionnaires d'événements dans CreateChildControls.
  • Composite implémente INamingContainer pour acheminer un événement de publication vers son contrôle Button enfant.

Remarquez que vous pouvez propager les événements à partir des contrôles enfants jusqu'au conteneur et les exposer en tant qu'événements de niveau supérieur dans celui-ci. Pour plus d'informations, consultez Propagation d'un événement et Exemple de contrôle de propagation d'événements.

Vous trouverez ci-dessous le code de l'exemple de contrôle composite. Pour générer l'exemple, consultez les instructions fournies dans Exemples de contrôles serveur.

// 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

Utilisation d'un contrôle composite sur une page

L'exemple suivant utilise le contrôle composite Composite sur une page ASP.NET.

<%@ 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>

Voir aussi

Contrôle composite et contrôle utilisateur | Composition et rendu | Propagation d'un événement | Exemple de contrôle de propagation d'événements