Interfacce correlate all'associazione dati

Aggiornamento: novembre 2007

ADO.NET consente di creare numerose strutture di dati diverse per soddisfare le esigenze di associazione specifiche dell'applicazione e dei dati utilizzati. Può essere opportuno creare proprie classi che forniscano o utilizzino i dati in Windows Form. Questi oggetti sono in grado di offrire diversi livelli di funzionalità e complessità, dall'associazione semplice di dati alla fornitura di supporto in fase di progettazione, al controllo degli errori, alla notifica delle modifiche, fino al ripristino strutturato dello stato precedente le modifiche apportate ai dati.

Consumer delle interfacce di associazione dati

Nelle sezioni successive vengono descritti due gruppi di oggetti interfaccia. Nel primo gruppo sono elencate le interfacce che vengono implementate sulle origini dati dagli autori di origini dati. Queste interfacce sono progettate per l'utilizzo da parte dei consumer di origini dati, che nella maggior parte dei casi sono rappresentati da controlli o componenti Windows Form. Nel secondo gruppo sono elencate le interfacce progettate per l'utilizzo da parte degli autori di componenti. Gli autori di componenti utilizzano queste interfacce quando creano un componente che prevede l'utilizzo dell'associazione dati da parte del modulo di associazione dati Windows Form. È possibile implementare queste interfacce all'interno di classi associate al form per attivare l'associazione dati. Ciascun caso presenta una classe che implementa un'interfaccia mediante la quale viene stabilita l'interazione con i dati. Gli strumenti di progettazione dati e di sviluppo rapido di applicazioni (RAD, Rapid Application Development) di Visual Studio sono già in grado di sfruttare questa funzionalità.

Per ulteriori informazioni sull'implementazione di interfacce, vedere Parola chiave Implements e istruzione Implements (Visual Basic) o interface (Riferimenti per C#) (parola chiave C#).

Interfacce per l'implementazione da parte degli autori di origini dati

Le interfacce descritte di seguito sono progettate per l'utilizzo da parte di controlli Windows Form:

  • Interfaccia IList

    Una classe che implementa l'interfaccia IList potrebbe essere Array, ArrayList o CollectionBase. Si tratta di elenchi indicizzati di elementi di tipo Object. Questi elenchi devono contenere tipi omogenei, perché il primo elemento dell'indice determina il tipo. La disponibilità dell'interfaccia IList è garantita per l'associazione solo in fase di esecuzione.

    Nota:

    Se si desidera creare un elenco di oggetti business per l'associazione con Windows Form, è necessario prendere in considerazione l'utilizzo di BindingList<T>. BindingList<T> è una classe estensibile che implementa le interfacce primarie richieste per l'associazione dati bidirezionale di Windows Form.

  • Interfaccia IBindingList

    Una classe che implementa l'interfaccia IBindingList fornisce funzionalità per l'associazione dati di livello decisamente superiore. Questa implementazione fornisce funzionalità di ordinamento di base e la notifica delle modifiche, sia per modifiche delle voci contenute nell'elenco, ad esempio per una variazione nel campo Indirizzo della terza voce di un elenco di clienti, sia per cambiamenti dell'elenco stesso, ad esempio dovuti a un aumento o a una diminuzione delle voci presenti nell'elenco. La notifica delle modifiche è importante quando si pianifica di associare più controlli agli stessi dati e si desidera che la modifica dei dati avvenga in uno dei controlli e venga propagata agli altri controlli associati.

    Nota:

    La notifica delle modifiche viene attivata per l'interfaccia IBindingList mediante la proprietà SupportsChangeNotification che, se impostata su true, genera un evento ListChanged, il quale indica che l'elenco o una voce nell'elenco è cambiata.

    Il tipo di modifica è descritto dalla proprietà ListChangedType del parametro ListChangedEventArgs. Ogni volta che il modello di dati viene aggiornato, dunque, verranno aggiornate anche tutte le visualizzazioni dipendenti, come ad esempio gli altri controlli associati alla stessa origine dati. Gli oggetti contenuti nell'elenco dovranno tuttavia segnalare all'elenco quando subiscono modifiche, in modo che l'elenco possa generare l'evento ListChanged.

    Nota:

    La classe BindingList<T> fornisce un'implementazione generica dell'interfaccia IBindingList.

  • Interfaccia IBindingListView

    Una classe che implementa l'interfaccia IBindingListView fornisce tutte le funzionalità di un'implementazione di IBindingList e le funzionalità di filtro e ordinamento avanzato. Questa implementazione fornisce funzionalità di filtro basate su stringhe e di ordinamento multicolonna con coppie descrittore-direzione delle proprietà.

  • Interfaccia IEditableObject

    Una classe che implementa l'interfaccia IEditableObject consente a un oggetto di controllare quando le modifiche apportate a tale oggetto sono permanenti. Questa implementazione mette a disposizione i metodi BeginEdit, EndEdit e CancelEdit che consentono di ripristinare lo stato precedente e le modifiche apportate all'oggetto. Di seguito viene fornita una breve descrizione del funzionamento dei metodi BeginEdit, EndEdit e CancelEdit e della relativa interazione per attivare un possibile ripristino dello stato precedente le modifiche apportate ai dati:

    • Il metodo BeginEdit segnala l'inizio della modifica di un oggetto. È necessario che un oggetto che implementa questa interfaccia esegua l'archiviazione di qualsiasi aggiornamento dopo la chiamata al metodo BeginEdit in modo da poter annullare gli aggiornamenti se viene chiamato il metodo CancelEdit. Nell'associazione dati in Windows Form è possibile chiamare il metodo BeginEdit più volte nell'ambito di una singola transazione di modifica, ad esempio BeginEdit, BeginEdit, EndEdit). Le implementazioni di IEditableObject devono consentire di controllare se il metodo BeginEdit è già stato chiamato e ignorare le chiamate successive al metodo BeginEdit. Poiché questo metodo può essere chiamato più volte, è importante che le chiamate successive non siano distruttive, ovvero che le successive chiamate a BeginEdit non eliminino gli aggiornamenti o le modifiche apportate ai dati salvati con la prima chiamata a BeginEdit.

    • Il metodo EndEdit inserisce nell'oggetto sottostante tutte le modifiche apportate dopo la chiamata a BeginEdit, se l'oggetto si trova in modalità di modifica.

    • Il metodo CancelEdit annulla tutte le modifiche apportate all'oggetto.

    Per ulteriori informazioni sul funzionamento dei metodi BeginEdit, EndEdit e CancelEdit, vedere Cenni preliminari sul salvataggio dei dati.

    Questa nozione transazionale delle funzionalità dei dati viene utilizzata dal controllo DataGridView.

  • Interfaccia ICancelAddNew

    Di solito, una classe che implementa l'interfaccia ICancelAddNew implementa anche l'interfaccia IBindingList e consente di ripristinare un'aggiunta apportata all'origine dati con il metodo AddNew. Se l'origine dati implementa l'interfaccia IBindingList, è necessario che implementi anche l'interfaccia ICancelAddNew.

  • Interfaccia IDataErrorInfo

    Una classe che implementa l'interfaccia IDataErrorInfo consente agli oggetti di fornire informazioni personalizzate sugli errori ai controlli associati:

    • La proprietà Error restituisce il testo di messaggi di errore generici, ad esempio "Si è verificato un errore".

    • La proprietà Item restituisce una stringa con un messaggio di errore specifico dalla colonna, ad esempio "Il valore della colonna State non è valido".

  • Interfaccia IEnumerable

    Una classe che implementa l'interfaccia IEnumerable è generalmente utilizzata da ASP.NET. Il supporto Windows Form per questa interfaccia è disponibile solo mediante il componente BindingSource.

    Nota:

    Il componente BindingSource copia tutti gli elementi dell'interfaccia IEnumerable in un elenco separato per motivi di associazione.

  • Interfaccia ITypedList

    Una classe di insiemi che implementa l'interfaccia ITypedList consente di gestire l'ordine e l'insieme di proprietà esposte al controllo associato.

    Nota:

    Quando si implementa il metodo GetItemProperties e l'array PropertyDescriptor non è null, l'ultima voce della matrice sarà il descrittore della proprietà che descrive la proprietà elenco rappresentata da un altro elenco di elementi.

  • Interfaccia ICustomTypeDescriptor

    Una classe che implementa l'interfaccia ICustomTypeDescriptor fornisce informazioni dinamiche su se stessa. Questa interfaccia è simile a ITypedList ma è utilizzata per oggetti diversi dagli elenchi. L'interfaccia è utilizzata dalla classe DataRowView per proiettare lo schema delle righe sottostanti. Una implementazione semplice di ICustomTypeDescriptor viene fornita dalla classe CustomTypeDescriptor.

    Nota:

    Per supportare l'associazione in fase di progettazione a tipi che implementano l'interfaccia ICustomTypeDescriptor, il tipo deve implementare anche l'interfaccia IComponent e deve esistere in un'istanza nel form.

  • Interfaccia IListSource

    Una classe che implementa l'interfaccia IListSource consente l'associazione basata su elenchi in oggetti non di elenco. Il metodo GetList dell'interfaccia IListSource è utilizzato per restituire un elenco associabile da un oggetto che non eredita da IList. L'interfaccia IListSource è utilizzata dalla classe DataSet.

  • Interfaccia IRaiseItemChangedEvents

    Una classe che implementa l'interfaccia IRaiseItemChangedEvents è un elenco associabile che implementa anche l'interfaccia IBindingList. Questa interfaccia è utilizzata per indicare se il tipo genera eventi ListChanged di tipo ItemChanged mediante la proprietà RaisesItemChangedEvents.

    Nota:

    È necessario implementare l'interfaccia IRaiseItemChangedEvents se l'origine dati fornisce la proprietà per elencare la conversione degli eventi descritta precedentemente e interagisce con il componente BindingSource. In caso contrario, anche l'interfaccia BindingSource eseguirà la proprietà per elencare la conversione degli eventi, con conseguente riduzione delle prestazioni.

  • Interfaccia ISupportInitialize

    Un componente che implementa l'interfaccia ISupportInitialize trae vantaggio dalle ottimizzazioni batch per l'impostazione delle proprietà e l'inizializzazione delle proprietà codipendenti. L'interfaccia ISupportInitialize contiene due metodi:

    • Il metodo BeginInit segnala l'avvio dell'inizializzazione dell'oggetto.

    • Il metodo EndInit segnala la fine dell'inizializzazione dell'oggetto.

  • Interfaccia ISupportInitializeNotification

    Un componente che implementa l'interfaccia ISupportInitializeNotification implementa anche l'interfaccia ISupportInitialize. Questa interfaccia consente di notificare agli altri componenti dell'interfaccia ISupportInitialize il completamento dell'inizializzazione. L'interfaccia ISupportInitializeNotification contiene due membri:

    • La proprietà IsInitialized restituisce un valore boolean che indica se il componente è stato inizializzato.

    • L'evento Initialized si verifica quando viene chiamato il metodo EndInit.

  • Interfaccia INotifyPropertyChanged

    Una classe che implementa questa interfaccia è un tipo che genera un evento al variare di uno dei rispettivi valori di proprietà. L'interfaccia è progettata per sostituire il criterio che prevede un evento di modifica per ciascuna proprietà di un controllo. Quando è utilizzata in una classe BindingList<T>, l'oggetto business deve implementare l'interfaccia INotifyPropertyChanged e la classe BindingList`1 convertirà gli eventi PropertyChanged in eventi ListChanged di tipo ItemChanged.

    Nota:

    Perché possano essere notificate le modifiche in un'associazione tra un client associato e un'origine dati, il tipo di origine dati associata deve implementare l'interfaccia INotifyPropertyChanged (opzione preferita); in alternativa, si possono fornire eventi NomeProprietàChanged per il tipo associato, ma non si possono svolgere entrambe le operazioni.

Interfacce per l'implementazione da parte degli autori di componenti

Le interfacce descritte di seguito sono progettate per l'utilizzo da parte del modulo di associazione dati di Windows Form:

Vedere anche

Attività

Procedura: creare un controllo con associazione semplice in un Windows Form

Concetti

Associazione dati e Windows Form

Altre risorse

Associazione ai dati di Windows Form