Condividi tramite


Esempio di proprietà Collection di Web Control

Aggiornamento: novembre 2007

Nell'esempio riportato di seguito vengono illustrate le modalità di creazione di un controllo denominato QuickContacts che implementa la persistenza in una pagina di una proprietà Collection. Il controllo illustrato nell'esempio consente a uno sviluppatore di pagine di archiviare un elenco di contatti della rubrica. Il controllo QuickContacts espone una proprietà Collection Contacts che contiene oggetti Contact. La classe Contact presenta le proprietà Name, Email e Phone.

Gli elementi Contact della proprietà Collection Contacts vengono mantenuti racchiusi tra tag del controllo, come mostrato nell'esempio seguente:

<aspSample:QuickContacts ID="QuickContacts1" Runat="server">
  <aspSample:Contact Name="someone" Email="someone@example.com"     Phone="(555) 555-5555"/><aspSample:Contact Name="jae" Email="jae@fourthcoffee.com"     Phone="(555) 555-5555"/>
</aspSample:QuickContacts>

Per maggiore chiarezza, il controllo QuickContacts non implementa la gestione dello stato per la proprietà Collection. Gli elementi dell'insieme devono essere aggiunti alla pagina in modo dichiarativo o, se creati nel codice, devono essere ricreati durante il postback. In un controllo in produzione, è necessario implementare la gestione dello stato. Per informazioni dettagliate, vedere Gestione dello stato personalizzato di controlli server.

Listato di codice per il controllo QuickContacts

' QuickContacts.vb
Option Strict On
Imports System
Imports System.ComponentModel
Imports System.Collections
Imports System.Drawing.Design
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace Samples.AspNet.VB.Controls
    < _
    AspNetHostingPermission(SecurityAction.Demand, _
        Level:=AspNetHostingPermissionLevel.Minimal), _
    AspNetHostingPermission(SecurityAction.InheritanceDemand, _
        Level:=AspNetHostingPermissionLevel.Minimal), _
    DefaultProperty("Contacts"), _
    ParseChildren(True, "Contacts"), _
    ToolboxData( _
        "<{0}:QuickContacts runat=""server""> </{0}:QuickContacts>") _
    > _
    Public Class QuickContacts
        Inherits WebControl

        Private contactsList As ArrayList

        < _
        Category("Behavior"), _
        Description("The contacts collection"), _
        DesignerSerializationVisibility( _
            DesignerSerializationVisibility.Content), _
        Editor(GetType(ContactCollectionEditor), _
            GetType(UITypeEditor)), _
        PersistenceMode(PersistenceMode.InnerDefaultProperty) _
        > _
        Public ReadOnly Property Contacts() As ArrayList
            Get
                If contactsList Is Nothing Then
                    contactsList = New ArrayList
                End If
                Return contactsList
            End Get
        End Property

        ' The contacts are rendered in an HTML table.
        Protected Overrides Sub RenderContents( _
        ByVal writer As HtmlTextWriter)
            Dim t As Table = CreateContactsTable()
            If t IsNot Nothing Then
                t.RenderControl(writer)
            End If
        End Sub

        Private Function CreateContactsTable() As Table
            Dim t As Table = Nothing
            If (contactsList IsNot Nothing) AndAlso _
                (contactsList.Count > 0) Then
                t = New Table
                For Each item As Contact In contactsList
                    Dim aContact As Contact = TryCast(item, Contact)
                    If aContact IsNot Nothing Then
                        Dim r As New TableRow
                        Dim c1 As New TableCell
                        c1.Text = aContact.Name
                        r.Controls.Add(c1)

                        Dim c2 As New TableCell
                        c2.Text = aContact.Email
                        r.Controls.Add(c2)

                        Dim c3 As New TableCell
                        c2.Text = aContact.Phone
                        r.Controls.Add(c3)

                        t.Controls.Add(r)
                    End If
                Next
            End If
            Return t
        End Function
    End Class
End Namespace
// QuickContacts.cs
using System;
using System.ComponentModel;
using System.Collections;
using System.Drawing.Design;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Samples.AspNet.CS.Controls
{
    [
    AspNetHostingPermission(SecurityAction.Demand,
        Level = AspNetHostingPermissionLevel.Minimal),
    AspNetHostingPermission(SecurityAction.InheritanceDemand, 
        Level=AspNetHostingPermissionLevel.Minimal),
    DefaultProperty("Contacts"),
    ParseChildren(true, "Contacts"),
    ToolboxData(
        "<{0}:QuickContacts runat=\"server\"> </{0}:QuickContacts>")
    ]
    public class QuickContacts : WebControl
    {
        private ArrayList contactsList;

        [
        Category("Behavior"),
        Description("The contacts collection"),
        DesignerSerializationVisibility(
            DesignerSerializationVisibility.Content),
        Editor(typeof(ContactCollectionEditor), typeof(UITypeEditor)),
        PersistenceMode(PersistenceMode.InnerDefaultProperty)
        ]
        public ArrayList Contacts
        {
            get
            {
                if (contactsList == null)
                {
                    contactsList = new ArrayList();
                }
                return contactsList;
            }
        }


        // The contacts are rendered in an HTML table.
        protected override void RenderContents(
            HtmlTextWriter writer)
        {
            Table t = CreateContactsTable();
            if (t != null)
            {
                t.RenderControl(writer);
            }
        }

        private Table CreateContactsTable()
        {
            Table t = null;

            if (contactsList != null && contactsList.Count > 0)
            {
                t = new Table();

                foreach (Contact item in contactsList)
                {
                    Contact aContact = item as Contact;

                    if (aContact != null)
                    {
                        TableRow r = new TableRow();

                        TableCell c1 = new TableCell();
                        c1.Text = aContact.Name;
                        r.Controls.Add(c1);

                        TableCell c2 = new TableCell();
                        c2.Text = aContact.Email;
                        r.Controls.Add(c2);


                        TableCell c3 = new TableCell();
                        c3.Text = aContact.Phone;
                        r.Controls.Add(c3);

                        t.Controls.Add(r);
                    }
                }
            }
            return t;
        }
    }
}

Illustrazione del codice

Per attivare il parsing degli elementi dell'insieme inclusi tra i tag di un controllo, il controllo QuickContacts aggiunge l'attributo ParseChildren(true, "Contacts") al controllo. Il primo argomento, true, di ParseChildrenAttribute specifica che il parser della pagina deve interpretare il contenuto nidificato incluso fra i tag del controllo come proprietà e non come controlli child. Il secondo argomento, "Contacts", fornisce il nome della proprietà interna predefinita. Quando si specifica il secondo argomento, il contenuto incluso fra i tag del controllo deve corrispondere solamente alla proprietà interna predefinita, ovvero a oggetti Contact.

Il controllo QuickContacts include inoltre, in fase di progettazione, gli attributi riportati di seguito, che è necessario applicare alla proprietà dell'insieme per la serializzazione e la persistenza in fase di progettazione:

  • DesignerSerializationVisibilityAttribute L'impostazione del parametroContent specifica che una finestra di progettazione visiva deve serializzare il contenuto della proprietà. Nell'esempio, la proprietà contiene oggetti Contact.

  • PersistenceModeAttribute Il passaggio del parametro InnerDefaultProperty specifica che una finestra di progettazione visiva deve mantenere la proprietà cui viene applicato l'attributo sotto forma di proprietà interna predefinita. Ciò significa che una finestra di progettazione visiva mantiene la proprietà inclusa fra i tag del controllo. È possibile applicare l'attributo solamente a una proprietà perché si può mantenere solo una proprietà inclusa tra i tag del controllo. Il valore della proprietà non è incluso in un tag speciale.

Il controllo QuickContacts associa un editor dell'insieme alla proprietà dell'insieme Contacts utilizzando EditorAttribute, come illustrato nell'esempio seguente:

Editor(typeof(ContactCollectionEditor), typeof(UITypeEditor))
Editor(GetType(ContactCollectionEditor), GetType(UITypeEditor))

L'associazione di un editor dell'insieme alla proprietà richiede al Visualizzatore proprietà l'apertura di un editor di insieme nella finestra di progettazione visiva per aggiungere elementi Contact. Tale editor è simile all'interfaccia utente (UI) per la modifica della proprietà Items dei controlli DropDownList o ListBox. L'editor dell'insieme personalizzato utilizzato da QuickContacts, ContactCollectionEditor, è descritto in Esempio di editor di insiemi.

Per maggior chiarezza, il controllo QuickContacts non definisce un insieme fortemente tipizzato ma utilizza ArrayList per il tipo dell'insieme. Di norma, è necessario utilizzare un insieme fortemente tipizzato come tipo della proprietà Collection, affinché che uno sviluppatore di applicazioni non possa aggiungere tipi all'applicazione in modo arbitrario.

Listato di codice per la classe Contact

Gli attributi in fase di progettazione nel codice della classe Contact sono necessari per la modifica della proprietà e la serializzazione in fase di progettazione. Il convertitore ExpandableObjectConverter del tipo associato alla classe Contact, utilizzando TypeConverterAttribute, richiede all'editor dell'insieme di fornire un'interfaccia utente di espansione/compressione per la modifica delle sottoproprietà, ovvero Name, Email, Phone. Tale interfaccia è simile all'interfaccia utente utilizzata per la modifica della proprietà Font di un controllo Web nel visualizzatore proprietà di una finestra di progettazione. NotifyParentPropertyAttribute, con l'argomento del costruttore uguale a true, se applicato alle proprietà Name, Email e Phone richiede all'editor di serializzare le modifiche di queste proprietà nella proprietà padre, un'istanza della classe Contact.

' Contact.vb
' The type of the items in the Contacts collection property 
' in QuickContacts.
Option Strict On
Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Web.UI

Namespace Samples.AspNet.VB.Controls
    < _
    TypeConverter(GetType(ExpandableObjectConverter)) _
    > _
    Public Class Contact
        Private _name As String
        Private _email As String
        Private _phone As String

        Public Sub New()
            Me.New(String.Empty, String.Empty, String.Empty)
        End Sub

        Public Sub New(ByVal name As String, _
        ByVal email As String, ByVal phone As String)
            _name = name
            _email = email
            _phone = phone
        End Sub

        < _
        Category("Behavior"), _
        DefaultValue(""), _
        Description("Name of contact"), _
        NotifyParentProperty(True) _
        > _
        Public Property Name() As String
            Get
                Return _name
            End Get
            Set(ByVal value As String)
                _name = value
            End Set
        End Property

        < _
        Category("Behavior"), _
        DefaultValue(""), _
        Description("Email address of contact"), _
        NotifyParentProperty(True) _
        > _
        Public Property Email() As String
            Get
                Return _email
            End Get
            Set(ByVal value As String)
                _email = value
            End Set
        End Property


        < _
        Category("Behavior"), _
        DefaultValue(""), _
        Description("Phone number of contact"), _
        NotifyParentProperty(True) _
        > _
        Public Property Phone() As String
            Get
                Return _phone
            End Get
            Set(ByVal value As String)
                _phone = value
            End Set
        End Property
    End Class
End Namespace
// Contact.cs
// The type of the items in the Contacts collection property 
//in QuickContacts.

using System;
using System.Collections;
using System.ComponentModel;
using System.Web.UI;

namespace Samples.AspNet.CS.Controls
{
    [
    TypeConverter(typeof(ExpandableObjectConverter))
    ]
    public class Contact
    {
        private string nameValue;
        private string emailValue;
        private string phoneValue;


        public Contact()
            : this(String.Empty, String.Empty, String.Empty)
        {
        }

        public Contact(string name, string email, string phone)
        {
            nameValue = name;
            emailValue = email;
            phoneValue = phone;
        }

        [
        Category("Behavior"),
        DefaultValue(""),
        Description("Name of contact"),
        NotifyParentProperty(true),
        ]
        public String Name
        {
            get
            {
                return nameValue;
            }
            set
            {
                nameValue = value;
            }
        }

        [
        Category("Behavior"),
        DefaultValue(""),
        Description("Email address of contact"),
        NotifyParentProperty(true)
        ]
        public String Email
        {
            get
            {
                return emailValue;
            }
            set
            {
                emailValue = value;
            }
        }

        [
        Category("Behavior"),
        DefaultValue(""),
        Description("Phone number of contact"),
        NotifyParentProperty(true)
        ]
        public String Phone
        {
            get
            {
                return phoneValue;
            }
            set
            {
                phoneValue = value;
            }
        }
    }
}

Pagina di prova per il controllo QuickContacts

L'esempio seguente illustra una pagina ASPX che utilizza il controllo QuickContacts.

<%@ Page Language="VB"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head id="Head1" >
    <title>
      QuickContacts test page
    </title>
  </head>
  <body>
    <form id="Form1" >
      <aspSample:QuickContacts ID="QuickContacts1" Runat="server" 
        BorderStyle="Solid" BorderWidth="1px">
        <aspSample:Contact Name="someone" Email="someone@example.com" 
          Phone="(555) 555-0100"/>
        <aspSample:Contact Name="jae" Email="jae@fourthcoffee.com" 
          Phone="(555) 555-0101"/>
        <aspSample:Contact Name="lene" Email="lene@contoso.com" 
          Phone="(555) 555-0102"/>        
      </aspSample:QuickContacts>
    </form>
  </body>
</html>
<%@ Page Language="C#"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head id="Head1" >
    <title>
      QuickContacts test page
    </title>
  </head>
  <body>
    <form id="Form1" >
      <aspSample:QuickContacts ID="QuickContacts1" Runat="server" 
        BorderStyle="Solid" BorderWidth="1px">
        <aspSample:Contact Name="someone" Email="someone@example.com" 
          Phone="(555) 555-0100"/>
        <aspSample:Contact Name="jae" Email="jae@fourthcoffee.com" 
          Phone="(555) 555-0101"/>
        <aspSample:Contact Name="lene" Email="lene@contoso.com" 
          Phone="(555) 555-0102"/>        
      </aspSample:QuickContacts>
    </form>
  </body>
</html>

Generazione e utilizzo dell'esempio

Compilare il controllo QuickContacts e la classe Contacts con l'editor ContactCollectionEditor elencato in Esempio di editor di insiemi. È necessario aggiungere un riferimento all'assembly System.Design per la compilazione.

Per informazioni sulla compilazione e sull'utilizzo degli esempi di controllo personalizzato, vedere Generazione degli esempi dei controlli server personalizzati.

Vedere anche

Concetti

Esempio di editor di insiemi

Generazione degli esempi dei controlli server personalizzati

Altre risorse

Sviluppo di controlli server ASP.NET personalizzati