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
Generazione degli esempi dei controlli server personalizzati