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
Construindo os Exemplos de Controle de Servidor Personalizado