Esempio di controllo server composto
Nel seguente esempio viene sviluppato un controllo composto (Composite
) che combina quattro controlli server ASP.NET: due controlli Textbox, un controllo Label e un controllo Button. Quando il controllo figlio Button viene selezionato, il controllo Composite
verifica che la somma dei due numeri immessi nelle caselle di testo sia equivalente a un numero specifico (definito come proprietà personalizzata) e genera un evento personalizzato. Espone inoltre la proprietà Text del controllo figlio Label come proprietà di primo livello.
I controlli figlio di un controllo composto sono incapsulati e, per impostazione predefinita, non sono visibili all'esterno del controllo padre. Uno sviluppatore di pagine può tentare di accedere ai controlli figlio mediante l'insieme Controls del controllo padre. La presenza di controlli effettivi potrebbe tuttavia rendere difficile ottenere l'indice di un particolare controllo figlio.
Un controllo composto consente di scegliere se esporre un controllo figlio come proprietà e quali proprietà ed eventi dei relativi controlli figlio esporre come proprietà ed eventi di primo livello. Quando un controllo composto sintetizza le proprietà a partire da quelle dei relativi controlli figlio, vengono creati soltanto dei delegati di tali proprietà nei controlli figlio, come illustrato nell'esempio riportato di seguito.
// 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
espone le seguenti proprietà pubbliche.
Number
Proprietà personalizzata che consente a uno sviluppatore di pagine di specificare un numero.
Text
Proprietà sintetizzata dalla proprietà Text del controllo figlio Label.
Composite
espone i seguenti eventi personalizzati.
Check
Evento personalizzato generato quando
Composite
verifica che la somma dei due numeri immessi nelle caselle di testo sia equivalente al valore diNumber
. L'eventoCheck
richiede il delegato dell'evento personalizzatoCheckEventHandler
e la classe corrispondente per i dati eventoCheckEventArgs
. Per ulteriori informazioni sulle modalità di definizione dell'evento personalizzato, vedere Definizione di un evento.
Il controllo Composite
comprende inoltre le seguenti funzionalità.
Composite
crea i controlli figlio nel metodo CreateChildControls anziché in OnInit o nel relativo costruttore.Composite
non espone l'evento Click del relativo controllo figlio Button, ma gestisce l'evento Click e genera l'evento personalizzatoCheck
. Nel caso in cui un controllo composto gestisca eventi generati dai relativi controlli figlio, è necessario collegare i gestori eventi nel metodo CreateChildControls.Composite
implementa l'interfaccia INamingContainer per l'invio di un evento postback al relativo controllo figlio Button.
È possibile eseguire il bubbling di eventi dai controlli figlio fino al contenitore ed esporli come eventi di primo livello. Per ulteriori informazioni, vedere Bubbling di un evento ed Esempio di controllo di bubbling degli eventi.
Di seguito viene illustrato il codice per un esempio di controllo composto. Per generare l'esempio, vedere le istruzioni in Esempi di controlli server.
// 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
Utilizzo di un controllo composto in una pagina
Nell'esempio riportato di seguito viene illustrato l'utilizzo del controllo composto Composite
in una pagina 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>
Vedere anche
Controllo composto e controllo utente | Composizione e rendering | Bubbling di un evento | Esempio di controllo di bubbling degli eventi