Sviluppo di controlli server Web personalizzati con associazione a dati per ASP.NET 1.1

Aggiornamento: novembre 2007

Un controllo server Web ASP.NET con associazione a dati offre un'interfaccia utente per un'origine dati che rappresenta un insieme di record o elementi. I controlli server Cenni preliminari sul controllo server Web GridView, Cenni preliminari sul controllo server Web DataList e Cenni preliminari sul controllo server Web Repeater sono esempi di controlli server Web con associazione a dati. Per ulteriori informazioni sui controlli con associazione a dati forniti con ASP.NET, vedere Cenni preliminari sui controlli server Web ASP.NET con associazione a dati.

In questo argomento vengono illustrati i passaggi necessari per implementare una versione minima di un controllo server personalizzato con associazione a dati compatibile con ASP.NET versione 1.1. Per ulteriori informazioni sulla creazione di controlli personalizzati con associazione a dati in ASP.NET versione 2.0, vedere Sviluppo di controlli server Web personalizzati con associazione a dati per ASP.NET 2.0. Per ulteriori informazioni sull'architettura generale e le implementazioni dei controlli personalizzati, vedere Sviluppo di controlli server ASP.NET personalizzati e Procedura dettagliata: sviluppo e utilizzo di un controllo server personalizzato.

Quando creare un controllo personalizzato con associazione a dati

Prima di creare un controllo personalizzato con associazione a dati, rivedere le funzionalità dei controlli con associazione a dati fornite con ASP.NET. I controlli esistenti potrebbero soddisfare le esigenze specifiche del caso oppure si può decidere di creare un controllo personalizzato che estende un controllo esistente che fornisce già molte delle funzionalità necessarie. Per ulteriori informazioni sui controlli con associazione a dati forniti con ASP.NET, vedere Cenni preliminari sui controlli server Web ASP.NET con associazione a dati.

Di seguito sono riportate alcune ragioni che possono far propendere per la creazione di un controllo personalizzato con associazione a dati:

  • Per le esigenze specifiche del caso sono necessarie un'interfaccia utente personalizzata, funzionalità personalizzate di ordinamento dei dati e funzionalità personalizzate di modifica dei dati che non sono disponibili nei controlli con associazione a dati esistenti.

  • Si desidera creare un controllo personalizzato con associazione a dati precompilato e ridistribuibile.

  • Si desidera estendere le funzionalità di un controllo con associazione a dati fornito con ASP.NET.

  • Si desidera creare un controllo con associazione a dati con una finestra di progettazione personalizzata adattata alle necessità specifiche del caso.

Funzionalità di base di un controllo personalizzato con associazione a dati

Derivandolo dalla classe Control o WebControl, il controllo personalizzato con associazione a dati eredita automaticamente numerose funzionalità incorporate, incluse le seguenti:

  • Uno modello di associazione a dati esplicito che supporta le espressioni di associazione a dati. Tale modello di ASP.NET esegue l'associazione a dati solo quando necessario, invece che in occasione di ogni postback. Dopo che una pagina esegue la prima richiesta di associazione a dati, le richieste successive tentano di recuperare i dati dallo stato di visualizzazione. In questo modo le prestazione risultano migliorate in quanto si elimina la necessità di riconnettersi all'origine dati a ogni richiesta.

  • Supporto per le espressioni di associazione a dati che consentono agli sviluppatori della pagina di creare associazioni tra una proprietà esposta e contrassegnata in modo speciale del controllo e un'origine dati. Per ulteriori informazioni sulle espressioni di associazione dati, vedere Cenni preliminari sulle espressioni di associazione dati.

Utilizzo delle funzionalità della fase di progettazione disponibili

Ci sono funzionalità della fase di progettazione disponibili per tutti i controlli server Web che è possibile prendere in considerazione per il controllo personalizzato con associazione a dati. È possibile creare una classe della finestra di progettazione e modelli per il controllo personalizzato. Queste funzionalità vengono richiamate quando si utilizza il controllo in un'area di progettazione visiva, ad esempio la visualizzazione Progettazione di Visual Studio.

La creazione di una finestra di progettazione per il controllo aumenta considerevolmente le possibilità di utilizzo del controllo personalizzato in fase di progettazione. L'interfaccia utente della fase di progettazione semplifica infatti la personalizzazione delle proprietà del controllo. Per una panoramica sulle finestre di progettazione dei controlli ASP.NET, vedere Cenni preliminari sulle finestre Progettazione controlli ASP.NET. Per i relativi esempi, vedere HierarchicalDataBoundControlDesigner e Procedura dettagliata: creazione di una finestra Progettazione controlli di base per un controllo server Web.

Creando un controllo basato su modelli, si offre allo sviluppatore della pagina la flessibilità necessaria per specificare i controlli e i tag che definiscono l'interfaccia utente del controllo. Per un esempio di un controllo personalizzato basato su modelli, vedere Esempio di controllo server basato su modelli.

Implementazione di un controllo personalizzato con associazione a dati in ASP.NET

Nella tabella riportata di seguito è incluso un riepilogo dei requisiti specifici all'implementazione di un controllo server con associazione a dati in ASP.NET 1.1. Dopo la tabella, vengono fornite informazioni dettagliate su ogni requisito dell'implementazione.

Requisiti

Descrizione

Esporre la proprietà DataSource.

Consente allo sviluppatore della pagina di utilizzare il controllo per specificare l'origine dati a cui eseguire l'associazione.

Eseguire l'override del metodo DataBind e creare la logica necessaria per enumerare l'oggetto nell'origine dati associata.

Nella logica di questo metodo:

  • Il metodo OnDataBinding del controllo server viene richiamato per generare l'evento DataBind. In questo modo verranno valutate le espressioni di associazione a dati che lo sviluppatore della pagina ha associato al controllo server con associazione a dati.

  • È necessario fornire qui la logica necessaria per enumerare gli oggetti nell'origine dati.

  • Vengono creati tutti i controlli figlio per rappresentare visivamente l'origine dati.

Creare una gerarchia di controlli figlio mediante l'override del metodo CreateChildControls

Durante il postback, i controlli figlio vengono ricreati e associati ai dati archiviati nello stato di visualizzazione durante una chiamata DataBind precedente.

Nota:

Creare un solo metodo di supporto che possa essere richiamato dai metodi DataBind e CreateChildControls per creare la gerarchia dei controlli figlio. Ad esempio, il metodo di supporto che crea la gerarchia dei controlli figlio può accettare un valore Boolean che indica che i dati provengono dall'origine associata o dallo stato di visualizzazione. Questo modello consente di mantenere la creazione della gerarchia dei controlli figlio del controllo in un percorso di codice comune. Per un esempio di questo modello, vedere Procedura dettagliata: creazione di un controllo Web ASP.NET personalizzato con associazione a dati per ASP.NET 1.1.

Esposizione della proprietà DataSource

Un controllo con associazione a dati ASP.NET 1.1 derivato da Control o WebControl deve esporre una proprietà DataSource per consentire allo sviluppatore della pagina di selezionare la raccolta di dati alla quale il controllo server deve associarsi. In fase di esecuzione, il controllo personalizzato con associazione a dati enumera tramite la raccolta di dati assegnata alla proprietà DataSource mentre crea e associa gli elementi dell'interfaccia utente per rappresentare tali dati.

Un controllo server con associazione a dati può associarsi ai tipi seguenti:

Nell'esempio di codice riportato di seguito viene illustrato come esporre una proprietà DataSource di un controllo con associazione a dati. Il tipo DataSource viene dichiarato come tipo IEnumerable.

<Category("Data"), DefaultValue(""), Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")> _
Public Overridable Property DataSource() As IEnumerable
    Get
        Return _dataSource
    End Get
    Set(ByVal value As IEnumerable)
        If TypeOf value Is IEnumerable OrElse value Is Nothing Then
            _dataSource = value
        Else
            Throw New ArgumentException()
        End If
    End Set
End Property
[
Category("Data"),
DefaultValue(""),
Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")
]
public virtual IEnumerable DataSource
{
    get
    {
        return _dataSource;
    }
    set
    {
        if ((value is IEnumerable) || (value == null))
        {
            _dataSource = value;
        }
        else
        {
            throw new ArgumentException();
        }
    }
}

Questo esempio inizia con gli attributi dei metadati, ad esempio [Category], [DefaultValue] e [Description] che forniscono informazioni utilizzate dagli strumenti di progettazione, dal parser di pagine ASP.NET, dal runtime di ASP.NET e da Common Language Runtime (CLR). L'attributo BindableAttribute notifica alla finestra di progettazione visiva che il Visualizzatore proprietà è in grado di visualizzare le proprietà associabili del controllo in una finestra di dialogo. Ad esempio, in Visual Studio le proprietà associabili vengono visualizzate nella finestra di dialogo DataBindings. L'attributo CategoryAttribute specifica come definire le categorie della proprietà nel Visualizzatore proprietà della finestra di progettazione visiva. Per ulteriori informazioni sugli attributi dei metadati, inclusi quelli utilizzati in questo esempio, vedere Attributi di metadati per controlli server personalizzati.

La funzione di accesso set per la proprietà DataSource verifica che il valore da impostare sia null o di tipo IEnumerable. In questo esempio, lo sviluppatore della pagina può pertanto associare dati a qualsiasi tipo IEnumerable, ad esempio un oggetto Array, ArrayList o Hashtable. In alternativa, lo sviluppatore può impostare la proprietà DataSource su null finché non è disponibile un'origine dati adatta di tipo IEnumerable.

Nota:

Se si desidera che il controllo server personalizzato con associazione a dati sia in grado di associarsi a un tipo di dati IEnumerable o IListSource, è possibile dichiarare la proprietà DataSource come tipo generico Object. In questo caso, la funzione di accesso set che espone la proprietà DataSource deve verificare il tipo dell'oggetto passato e quindi implementare IEnumerable o IListSource.

Esecuzione dell'override del metodo DataBind ed enumerazione dell'origine dati associata

Si fornisce un override al metodo base DataBind nel controllo personalizzato per consentire l'esecuzione di due attività, ovvero l'enumerazione tramite la raccolta di dati associata e la creazione della gerarchia dei controlli figlio che rappresenterà i dati. Nell'elenco seguente sono riepilogate le attività che è necessario eseguire all'interno del metodo DataBind sottoposto a override:

  • Richiamare il metodo base OnDataBinding del controllo personalizzato.

  • Cancellare gli eventuali controlli figlio esistenti.

  • Cancellare lo stato di visualizzazione dei controlli figlio.

  • Registrare lo stato in modo che le modifiche durante l'associazione dati siano persistenti nello stato di visualizzazione.

  • Creare la gerarchia dei controlli figlio.

  • Impostare la proprietà ChildControlsCreated su true.

Iniziare a richiamare il metodo base OnDataBinding del controllo dall'interno del metodo DataBind sottoposto a override nel controllo. Richiamando il metodo base OnDataBinding del controllo, verranno valutate tutte le espressioni di associazione a dati del controllo. Nell'esempio di codice seguente viene illustrato come richiamare il metodo OnDataBinding in un controllo server con associazione a dati come prima attività all'interno del metodo DataBind sottoposto a override.

public override void DataBind()
{
    base.OnDataBinding(EventArgs.Empty);
}
Public Overrides Sub DataBind()
    MyBase.OnDataBinding(EventArgs.Empty)
End Sub

Cancellare quindi i controlli figlio esistenti. Poiché la gerarchia dei controlli figlio deve essere ricreata con ogni postback sulla base dei dati da associare, è necessario cancellare qualsiasi controllo figlio esistente richiamando il metodo Clear ereditato del controllo, come illustrato nell'esempio di codice seguente.

public override void DataBind()
{
    base.OnDataBinding(EventArgs.Empty);
    Controls.Clear();
}
Public Overrides Sub DataBind()
    MyBase.OnDataBinding(EventArgs.Empty)
    Controls.Clear()
End Sub

Verranno creati nuovi controlli figlio per rappresentare i dati associati. Lo stato di visualizzazione dei controlli figlio esistenti deve pertanto essere cancellato. Per cancellare lo stato di visualizzazione di tutti i controlli figlio, richiamare il metodo ClearChildViewState ereditato del controllo.

Dopo aver cancellato lo stato di visualizzazione dei controlli figlio esistenti, avviare la registrazione della stato di visualizzazione del controllo chiamando il metodo TrackViewStateereditato del controllo, che registra lo stato di visualizzazione. La registrazione dello stato del controllo viene avviata prima di creare la gerarchia dei controlli figlio. In questo modo, le eventuali modifiche apportate alla gerarchia dei controlli figlio durante l'associazione dati sono persistenti nello stato di visualizzazione. Poiché lo sviluppatore della pagina può richiamare DataBind durante l'evento PreInit della pagina, non è possibile basarsi sulla classe base del controllo per registrare lo stato di visualizzazione che si verifica dopo tale fase del ciclo di vita della pagina. In questo caso, la registrazione dello stato di visualizzazione per il controllo avverrebbe troppo tardi nel processo.

Nell'esempio di codice seguente viene illustrato un controllo server con associazione a dati che richiama il metodo TrackViewState.

public override void DataBind() 
{
    TrackViewState();
}
Public Overrides Sub DataBind()
    TrackViewState()
End Sub

Creare quindi la gerarchia dei controlli figlio. La gerarchia dei controlli figlio rappresenta in modo visivo l'origine dati a cui è associato il controllo personalizzato con associazione a dati e viene creata quando il metodo DataBind o CreateChildControls sottoposto a override del controllo personalizzato viene richiamato dalla classe base del controllo. Quando il metodo DataBind sottoposto a override del controllo viene richiamato dalla classe base del controllo, la gerarchia dei controlli figlio del controllo viene creata in base all'origine dati associata. Quando il metodo CreateChildControls sottoposto a override del controllo viene richiamato dalla classe base, la gerarchia dei controlli figlio viene creata in base ai dati salvati nello stato di visualizzazione.

La creazione della gerarchia dei controlli figlio viene avviata richiamando il metodo DataBind del controllo. Il controllo enumera tramite i dati forniti dalla proprietà DataSource esposta e crea un'istanza di un nuovo controllo figlio per rappresentare ogni elemento dei dati. Ad esempio, se l'origine dati è una matrice di stringhe da associare alla proprietà Text dei controlli Button, iterare tramite la matrice creando un nuovo controllo Button con la proprietà Text assegnata all'elemento dei dati iterato rappresentato come una stringa.

Dopo aver creato la gerarchia dei controlli figlio, impostare la proprietà ChildControlsCreated su true per indicare che il metodo CreateChildControls non deve essere richiamato dalla classe base.

Nell'esempio di codice seguente viene illustrato un controllo server con associazione a dati con la proprietà ChildControlsCreated impostata su true.

public override void DataBind()
{
     ChildControlsCreated = true;
} 
Public Overrides Sub DataBind()
    ChildControlsCreated = True
End Sub

La classe del controllo personalizzato con associazione a dati deve fornire un metodo CreateChildControls sottoposto a override in cui il controllo ricrea la gerarchia dei controlli figlio e consente l'applicazione dello stato di visualizzazione salvato. (La stato di visualizzazione salvato viene registrato durante la più recente chiamata al metodo DataBind del controllo.)

Nell'elenco seguente sono riepilogate le attività che è necessario eseguire all'interno del metodo CreateChildControls sottoposto a override:

  • Cancellare gli eventuali controlli figlio esistenti.

  • Creare la gerarchia dei controlli figlio se lo stato di visualizzazione è disponibile.

Prima di ricreare la gerarchia dei controlli figlio, è necessario cancellare gli oggetti dei controlli figlio esistenti. A tale scopo, richiamare il metodo Clear.

Nell'esempio di codice seguente viene illustrato un controllo server con associazione a dati che richiama il metodo Clear.

public override void CreateChildControls()
{
    Controls.Clear();
}

Come ultimo passaggio, creare la gerarchia dei controlli figlio. Il metodo CreateChildControls deve ricreare la gerarchia dei controlli figlio se lo stato di visualizzazione è disponibile. Finché viene creato lo stesso numero e gli stessi tipi di controlli figlio nella stessa gerarchia, la stato di visualizzazione salvato viene applicato automaticamente ai controlli figlio. Il controllo può salvare le informazioni necessarie per ricreare lo stesso numero, lo stesso tipo e la stessa gerarchia di controlli figlio nella proprietà ViewState del controllo. Per ulteriori informazioni sul salvataggio dello stato di visualizzazione del controllo, vedere ViewState. Per un esempio di codice completo che illustra la creazione di una gerarchia di controlli figlio in un controllo personalizzato con associazione a dati, vedere Procedura dettagliata: creazione di un controllo Web ASP.NET personalizzato con associazione a dati per ASP.NET 1.1.

Generazione del controllo server personalizzato

Per informazioni sulla generazione del controllo server Web personalizzato con associazione a dati e sull'utilizzo di tale controllo in una pagina Web, vedere Generazione degli esempi dei controlli server personalizzati.

Nota:

È necessario aggiungere un riferimento all'assembly System.Design per includerlo nella compilazione.

Vedere anche

Attività

Procedura dettagliata: creazione di un controllo Web ASP.NET personalizzato con associazione a dati per ASP.NET 1.1

Procedura dettagliata: sviluppo e utilizzo di un controllo server personalizzato

Concetti

Cenni preliminari sui controlli server Web ASP.NET con associazione a dati

Attributi di metadati per controlli server personalizzati

Cenni preliminari sulle finestre Progettazione controlli ASP.NET

Riferimenti

HierarchicalDataBoundControlDesigner

Altre risorse

Sviluppo di controlli server ASP.NET personalizzati