Interfacce correlate all'associazione dati
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 abilitare l'associazione dati; ogni caso presenta una classe che implementa un'interfaccia che abilita l'interazione con i dati. Gli strumenti di progettazione dati sviluppo rapido di applicazioni (RAD) di Visual Studio sfruttano già questa funzionalità.
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. IList sarà disponibile 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 Salvataggio dei dati nei dataset.
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:
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 di IListSource è utilizzato per restituire un elenco associabile da un oggetto che non eredita da IList. L'oggetto IListSource è utilizzato 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:
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:
Interfaccia IBindableComponent
Una classe che implementa questa interfaccia è un componente diverso da un controllo che supporta l'associazione dati. Tale classe restituisce le associazioni dati e il contesto di associazione del componente mediante le proprietà DataBindings e BindingContext dell'interfaccia.
Nota
Se il componente eredita dalla classe Control, non occorre implementare l'interfaccia IBindableComponent.
Interfaccia ICurrencyManagerProvider
Una classe che implementa l'interfaccia ICurrencyManagerProvider è un componente che fornisce la propria classe CurrencyManager per gestire le associazioni abbinate a questo particolare componente. L'accesso alla classe CurrencyManager personalizzata è fornito dalla proprietà CurrencyManager.
Nota
Poiché una classe che eredita da Control gestisce automaticamente le associazioni mediante la proprietà BindingContext, i casi in cui occorre implementare l'interfaccia ICurrencyManagerProvider sono piuttosto rari.
Vedere anche
Attività
Procedura: creare un controllo con associazione semplice in un Windows Form
Concetti
Associazione dati e Windows Form