Esempio di controllo di bubbling degli eventi

Il controllo personalizzato EventBubbler, descritto di seguito, rappresenta un semplice esempio di bubbling degli eventi. EventBubbler è un controllo composto che contiene caselle di testo, pulsanti e un controllo etichetta. EventBubbler passa tramite bubbling gli eventi di comando dai pulsanti al controllo contenitore padre, ovvero a se stesso, e li espone come eventi di primo livello. Per generare l'esempio, vedere le istruzioni in Esempi di controlli server.

Per un esempio pratico, vedere Esempio di controllo basato su template con associazione a dati.

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomControls 
{
   
   public class EventBubbler : Control, INamingContainer 
   {
      private int number = 100;
      private Label label;
      private TextBox box1;
      private TextBox box2;
      
      public event EventHandler Click;
      public event EventHandler Reset;
      public event EventHandler Submit;
      
      public string Label
      {
         get
         {
            EnsureChildControls();
            return label.Text;
         }
         set
         {
            EnsureChildControls();
            label.Text = value;
         }
      }
      
      public int Number
      {
         get
         {
            return number;
         }
         set
         {
            number = value;
         }
      }
      
      public string Text1
      {
         get
         {
            EnsureChildControls();
            return box1.Text;
         }
         set
         {
            EnsureChildControls();
            box1.Text = value;
         }
      }
      
      public string Text2
      {
         get
         {
            EnsureChildControls();
            return box2.Text;
         }
         set
         {
            EnsureChildControls();
            box2.Text = value;
         }
      }
      
      
      protected override void CreateChildControls() 
      {
         
         Controls.Add(new LiteralControl("<h3>Enter a number : "));
         
         box1 = new TextBox();
         box1.Text = "0";
         Controls.Add(box1);
         
         Controls.Add(new LiteralControl("</h3>"));
         
         Controls.Add(new LiteralControl("<h3>Enter another number : "));
         
         box2 = new TextBox();
         box2.Text = "0";
         Controls.Add(box2);
         
         Controls.Add(new LiteralControl("</h3>"));
         
         Button button1 = new Button();
         button1.Text = "Click";
         button1.CommandName = "Click";
         Controls.Add(button1);
         
         Button button2 = new Button();
         button2.Text = "Reset";
         button2.CommandName = "Reset";
         Controls.Add(button2);
         
         Button button3 = new Button();
         button3.Text = "Submit";
         button3.CommandName = "Submit";
         Controls.Add(button3);
         
         Controls.Add(new LiteralControl("<br><br>"));
         label = new Label();
         label.Height = 50;
         label.Width = 500;
         label.Text = "Click a button.";
         Controls.Add(label);
         
      }
      
      protected override bool OnBubbleEvent(object source, EventArgs e) 
      {   
         bool handled = false;
         if (e is CommandEventArgs)
         {
            CommandEventArgs ce = (CommandEventArgs)e;
            if (ce.CommandName == "Click")
            {
               OnClick(ce);
               handled = true;   
            }  
            else if (ce.CommandName == "Reset")
            {
               OnReset(ce);
               handled = true;   
            }
            else if (ce.CommandName == "Submit")
            {
               OnSubmit(ce);
               handled = true;   
            }
            
         }
         return handled;            
      }
      
      protected virtual void OnClick (EventArgs e)
      {
         if (Click != null)
         {
            Click(this,e);
         }
      }
      
      protected virtual void OnReset (EventArgs e)
      {
         if (Reset != null)
         {
            Reset(this,e);
         }
      }
      
      protected virtual void OnSubmit (EventArgs e)
      {
         if (Submit != null)
         {
            Submit(this,e);
         }
      }  
   }
}
[Visual Basic]
Option Explicit
Option Strict

Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace CustomControls
   Public Class EventBubbler
      Inherits Control
      Implements INamingContainer
      Private _number As Integer = 100
      Private _label As Label
      Private _box1 As TextBox
      Private _box2 As TextBox
      
      Public Event Click As EventHandler
      Public Event Reset As EventHandler
      Public Event Submit As EventHandler
      
      Public Property Label() As String
         Get
            EnsureChildControls()
            Return _label.Text
         End Get
         Set
            EnsureChildControls()
            _label.Text = value
         End Set
      End Property
      
      Public Property Number() As Integer
         Get
            Return _number
         End Get
         Set
            _number = value
         End Set
      End Property
      
      Public Property Text1() As String
         Get
            EnsureChildControls()
            Return _box1.Text
         End Get
         Set
            EnsureChildControls()
            _box1.Text = value
         End Set
      End Property
      
      Public Property Text2() As String
         Get
            EnsureChildControls()
            Return _box2.Text
         End Get
         Set
            EnsureChildControls()
            _box2.Text = value
         End Set
      End Property
      
      Protected Overrides Sub CreateChildControls()
         
         Controls.Add(New LiteralControl("<h3>Enter a number : "))
         
         _box1 = New TextBox()
         _box1.Text = "0"
         Controls.Add(_box1)
         
         Controls.Add(New LiteralControl("</h3>"))
         
         Controls.Add(New LiteralControl("<h3>Enter another number : "))
         
         _box2 = New TextBox()
         _box2.Text = "0"
         Controls.Add(_box2)
         
         Controls.Add(New LiteralControl("</h3>"))
         
         Dim button1 As New Button()
         button1.Text = "Click"
         button1.CommandName = "Click"
         Controls.Add(button1)
         
         Dim button2 As New Button()
         button2.Text = "Reset"
         button2.CommandName = "Reset"
         Controls.Add(button2)
         
         Dim button3 As New Button()
         button3.Text = "Submit"
         button3.CommandName = "Submit"
         Controls.Add(button3)
         
         Controls.Add(New LiteralControl("<br><br>"))
         _label = New Label()
         _label.Height = Unit.Pixel(50)
         _label.Width = Unit.Pixel(500)
         _label.Text = "Click a button."
         Controls.Add(_label)
      End Sub
       
      Protected Overrides Function OnBubbleEvent(source As Object, e As EventArgs) As Boolean
         Dim handled As Boolean = False
         If TypeOf e Is CommandEventArgs Then
            Dim ce As CommandEventArgs = CType(e, CommandEventArgs)
            If ce.CommandName = "Click" Then
               OnClick(ce)
               handled = True
            Else
               If ce.CommandName = "Reset" Then
                  OnReset(ce)
                  handled = True
               Else
                  If ce.CommandName = "Submit" Then
                     OnSubmit(ce)
                     handled = True
                  End If
               End If 
            End If
         End If
         Return handled
      End Function
      
      Protected Overridable Sub OnClick(e As EventArgs)
         RaiseEvent Click(Me, e)
      End Sub
      
      Protected Overridable Sub OnReset(e As EventArgs)
         RaiseEvent Reset(Me, e)
      End Sub
      
      Protected Overridable Sub OnSubmit(e As EventArgs)
         RaiseEvent Submit(Me, e)
      End Sub
   End Class
End Namespace

Utilizzo del controllo per il bubbling degli eventi in una pagina

Nell'esempio di pagina ASP.NET riportato di seguito viene utilizzato il controllo personalizzato per il bubbling degli eventi EventBubbler e vengono connessi i gestori eventi ai relativi eventi di primo livello.

<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>
<html>
<script language="C#" runat=server>

        private void ClickHandler(Object sender,EventArgs e)
        {
           MyControl.Label = "You clicked the <b> Click </b> button";

   }

        private void ResetHandler(Object sender,EventArgs e)
        {
          MyControl.Text1 = "0";
          MyControl.Text2 = "0";       

   }     

   private void SubmitHandler(Object sender,EventArgs e)
        {
          if ( Int32.Parse(MyControl.Text1) + Int32.Parse(MyControl.Text2) == MyControl.Number)
           MyControl.Label = "<h2> You won a million dollars!!!! </h2>";
          else 
           MyControl.Label = "Sorry, try again. The numbers you entered don't add up to" +
            " the hidden number.";

   }     
   
</script>
      
<body>

<h1> The Mystery Sum Game </h1><br>
         
<form runat=server>              
<Custom:EventBubbler id = "MyControl" OnClick = "ClickHandler" 
OnReset = "ResetHandler" OnSubmit = "SubmitHandler" Number= "10" runat = server/>                                     
</form>                       
</body>                    
</html>                  
[Visual Basic]
<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>
<html>
<script language="VB" runat=server>

    Private Sub ClickHandler(sender As Object, e As EventArgs)
       MyControl.Label = "You clicked the <b> Click </b> button"
    End Sub
     

    Private Sub ResetHandler(sender As Object, e As EventArgs)
       MyControl.Text1 = "0"
       MyControl.Text2 = "0"
    End Sub
     

    Private Sub SubmitHandler(sender As Object, e As EventArgs)
       If Int32.Parse(MyControl.Text1) + Int32.Parse(MyControl.Text2) = MyControl.Number Then
          MyControl.Label = "<h2> You won a million dollars!!!! </h2>"
       Else
          MyControl.Label = "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:EventBubbler id = "MyControl" OnClick = "ClickHandler" 
OnReset = "ResetHandler" OnSubmit = "SubmitHandler" Number= "10" runat = server/>                                     
</form>                       
</body>                    
</html>

Vedere anche

Bubbling di un evento | Esempio di controllo basato su template con associazione a dati