Exemplo da propriedade de coleção do controle da Web

Este exemplo mostra como criar um controle chamado QuickContacts que implementa a persistência em uma página de uma propriedade coleção.O exemplo de controle é um controle que permite que um desenvolvedor de página armazene uma lista de contatos do catálogo de endereços.O controle QuickContacts expõe uma propriedade de coleção Contacts contendo objetos Contact.A classe Contact possui propriedades Name, Email e Phone.

Os itens Contact da propriedade de coleção Contacts são persistentes dentro do controle de marcas, conforme mostrado no exemplo a seguir:

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

Para fins de esclarecimento, o controle QuickContacts não implementa o gerenciamento de estado para a propriedade de coleção.Os itens de coleção são considerados para serem adicionados declarativamente na página ou, se criados no código, eles devem ser recriados no postback.Em um controle de qualidade de produção, você implementaria o gerenciamento de estado.Para obter detalhes, consulte:Gerenciamento de Estado Personalizado de Controle de Servidor.

Listagem de Código para o Controle 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;
        }
    }
}

Discussão de Código

Para Ativar análise dos itens de coleção dentro de um controle de marcas, o controle QuickContacts adiciona o atributo ParseChildren(true, "Contacts") ao controle.O primeiro argumento (true)de ParseChildrenAttribute especifica que o analisador de página deve interpretar conteúdo aninhado dentro do controle de marcas como propriedades e não como controles filho.O segundo argumento ("Contacts") fornece o nome da propriedade interna padrão.Quando você especifica o segundo argumento, o conteúdo dentro do controle marcas deverá corresponder à propriedade interna padrão (Contact objetos) e nada mais.

O controle QuickContacts também inclui os atributos a seguir em tempo de design que você deve aplicar a uma propriedade de coleção para a serialização de tempo de design e a persistência:

  • DesignerSerializationVisibilityAttribute   Definir o parâmetro Content especifica que um designer visual deve serializar o conteúdo da propriedade.No exemplo, a propriedade contém objetos Contact.

  • PersistenceModeAttribute   Passar o parâmetro InnerDefaultProperty especifica que um designer visual deve manter a propriedade à qual o atributo é aplicado como uma propriedade interna padrão.Isso significa que um designer visual persiste a propriedade dentro das marcas do controle.O atributo pode ser aplicado a apenas uma propriedade, porque apenas uma propriedade pode ser persistentes dentro do controle de marcas.O valor da propriedade não é empacotado em uma marca especial.

O controle QuickContacts associa um editor de coleção com a propriedade de coleção Contacts usando o EditorAttribute, como no exemplo a seguir:

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

Associando um editor de coleção com a propriedade permite que o pesquisador de propriedades em um designer visual abra um editor de coleção para adicionar itens Contact.Isso é semelhante de interface do usuário (interface do usuário) para editar a propriedade Items de controles DropDownList ou ListBox.O editor de coleção personalizada usado pelo QuickContacts, ContactCollectionEditor, descrito em Exemplo de Editor de Coleção.

Para fins de esclarecimento, o controle QuickContacts não define uma coleção de tipo forte e, em vez disso, usa um ArrayList para seu tipo de coleção.Em geral, você deve usar uma coleção rigida como o tipo de propriedade de coleção para que um desenvolvedor de aplicativos não seja capaz de adicionar tipos arbitrários à coleção.

Listagem de código para a classe Contact

Os atributos em tempo de design no código da classe Contact são necessários para a propriedade de edição e de tempo de design de serialização.O conversor de tipos ExpandableObjectConverter associados à classe Contact (usando o TypeConverterAttribute) permite que o editor de coleção forneça uma interface do usuário espandir/recolher para edição de subpropriedades (Name, Email,Phone).Isso é semelhante para o interface do usuário você vê ao editar a propriedade Font de um controle da Web no navegador de um criador visual da propriedade.O NotifyParentPropertyAttribute (com o argumento de construtor igual a true) aplicado a Name,Email, e as propriedades Phone faz com que o editor serialize alterações nessas propriedades em sua propriedade pai, uma instância da 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;
            }
        }
    }
}

Testar Página para o Controle QuickContacts

The following example shows an .aspx page that uses the QuickContacts control.

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

Construindo e Usando o Exemplo

Compile o editor QuickContacts com o controle Contacts e a classe ContactCollectionEditor descrita em Exemplo de Editor de Coleção.Você deve adicionar uma referência ao conjunto de módulos (Assembly) System.Design para a compilação.

For more information about compiling and using the custom control examples, see Construindo os Exemplos de Controle de Servidor Personalizado.

Consulte também

Conceitos

Exemplo de Editor de Coleção

Construindo os Exemplos de Controle de Servidor Personalizado

Outros recursos

Desenvolvendo Controles Personalizados ASP.NET Server