Compartir a través de


Ejemplo de control de servidor compuesto

En el siguiente ejemplo se crea un control compuesto (Composite) que combina cuatro controles de servidor ASP.NET: dos controles Textbox, un control Label y un control Button. Cuando se hace clic en el control Button secundario, Composite comprueba si la suma de los dos números especificados en los cuadros de texto equivale a un número indicado (definido como propiedad personalizada) y genera un evento personalizado. También expone la propiedad Text de su control Label secundario como propiedad de nivel superior.

Tenga en cuenta que los controles secundarios de un control compuesto se encapsulan. De manera predeterminada, no son visibles fuera del principal. (Un programador de páginas podría intentar tener acceso a los controles secundarios utilizando la colección Controls del principal, pero la intervención de controles literales quizás dificulte la obtención del índice de un determinado control secundario.)

Los controles compuestos pueden exponer un control secundario como propiedad y decidir qué propiedades y eventos de sus controles secundarios se expondrán como propiedades y eventos de nivel superior. Cuando un control compuesto sintetiza propiedades a partir de las de sus controles secundarios, simplemente delega en dichos controles secundarios, como se muestra en el siguiente ejemplo.

// 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 expone las siguientes propiedades públicas.

  • Number

    Una propiedad personalizada que permite al creador de páginas especificar un número.

  • Text

    Un propiedad sintetizada a partir de la propiedad Text del control Label secundario.

Composite expone el siguiente evento personalizado.

  • Check

    Un evento personalizado que se genera cuando Composite comprueba si la suma de los dos números que figuran en los cuadros de texto equivale al valor de Number. El evento Check necesita el delegado de eventos personalizado, CheckEventHandler y la clase correspondiente para los datos del evento, CheckEventArgs. Para obtener información sobre cómo definir un evento personalizado, vea Definir un evento.

Observe también las siguientes características del control Composite.

  • Composite crea sus controles secundarios en el método CreateChildControls y no en OnInit o en su constructor.
  • Composite no expone el evento Click de su control secundario Button. En su lugar, controla el evento Click y genera el evento personalizado Check. Si un control compuesto controla eventos generados por sus controles secundarios, debe conectar los controladores de eventos en CreateChildControls.
  • Composite implementa INamingContainer para enrutar un evento de devolución automática hacia su control Button secundario.

Los eventos se pueden ejecutar desde los controles secundarios hasta el contenedor y exponerlos como eventos de nivel superior en éste. Para obtener más información, vea Ejecutar un evento y Ejemplo de control de ejecución de eventos.

A continuación se muestra el código para el ejemplo de control compuesto. Para generar el ejemplo, vea las instrucciones en Ejemplos de control de servidor.

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

Utilizar un control compuesto en una página

En el siguiente ejemplo se utiliza el control compuesto Composite en una página 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>

Vea también

Control compuesto frente a control de usuario Composición frente a procesamiento Ejecutar un evento | Ejemplo de control de ejecución de eventos