Panoramica del data binding (Windows Forms .NET)

Nei Windows Form è possibile effettuare associazioni non solo alle origini dati tradizionali, ma anche a quasi ogni struttura che contiene dati. È possibile effettuare associazioni a una matrice di valori che verranno calcolati in fase di esecuzione, letti da un file o derivati dai valori di altri controlli.

Inoltre, è possibile associare all'origine dati qualsiasi proprietà di qualunque controllo. Nelil data binding tradizionale viene in genere associata all'origine dati la proprietà relativa alla visualizzazione, ad esempio la proprietà Text di un controllo TextBox. Con .NET è anche possibile impostare altre proprietà tramite l'associazione. È possibile usare l'associazione per eseguire le attività seguenti:

  • Impostazione della grafica di un controllo immagine.

  • Impostazione del colore di sfondo di uno o più controlli.

  • Impostazione delle dimensioni dei controlli.

In pratica, il data binding rappresenta un sistema automatico per l'impostazione di qualsiasi proprietà accessibile in fase di esecuzione di qualsiasi controllo del form.

ADO.NET consente di creare molte strutture di dati diverse in base alle esigenze di associazione dell'applicazione e ai dati in uso. È possibile creare classi personalizzate che forniscono o utilizzano dati in Windows Forms. Questi oggetti possono offrire diversi livelli di funzionalità e complessità. Dal data binding di base, al supporto in fase di progettazione, al controllo degli errori, alla notifica delle modifiche o anche al supporto per un rollback strutturato delle modifiche apportate ai dati stessi.

Consumer di interfacce di data binding

Le sezioni seguenti descrivono due gruppi di oggetti interfaccia. Il primo gruppo di interfaccia viene implementato nelle origini dati dagli autori dell'origine dati. I consumer dell'origine dati, ad esempio i controlli Windows Forms o i componenti, implementano queste interfacce. Il secondo gruppo di interfaccia è progettato per l'uso da parte degli autori di componenti. Gli autori di componenti usano queste interfacce quando creano un componente che supporta il data binding da utilizzare dal motore di data binding Windows Forms. È possibile implementare queste interfacce all'interno delle classi associate al modulo per abilitare il data binding. Ogni caso presenta una classe che implementa un'interfaccia che consente l'interazione con i dati. Visual Studio strumenti di progettazione rapida dell'esperienza di sviluppo di applicazioni (RAD) sfruttano già questa funzionalità.

Interfacce per l'implementazione da parte degli autori dell'origine dati

I controlli Windows Forms implementano le interfacce seguenti:

  • Interfaccia IList

    Una classe che implementa l'interfaccia IList può essere , ArrayListArrayo CollectionBase. Questi sono elenchi indicizzati di elementi di tipo Object e gli elenchi devono contenere tipi omogenei, perché il primo elemento dell'indice determina il tipo. IList sarebbe disponibile per l'associazione solo in fase di esecuzione.

    Nota

    Se si vuole creare un elenco di oggetti business per l'associazione con Windows Forms, è consigliabile usare .BindingList<T> BindingList è una classe estendibile che implementa le interfacce primarie necessarie per il data binding bidirezionale Windows Forms.

  • Interfaccia IBindingList

    Una classe che implementa l'interfaccia IBindingList offre un livello molto più elevato di funzionalità di data binding. Questa implementazione offre funzionalità di ordinamento di base e notifica delle modifiche. Entrambi sono utili quando cambiano gli elementi dell'elenco e quando l'elenco stesso cambia. La notifica delle modifiche è importante se si prevede di associare più controlli agli stessi dati. Consente di apportare modifiche ai dati apportate in uno dei controlli da propagare agli altri controlli associati.

    Nota

    La notifica delle modifiche è abilitata per l'interfaccia IBindingList tramite la SupportsChangeNotification proprietà che, quando true, genera un ListChanged evento , che indica che l'elenco è stato modificato o un elemento nell'elenco è stato modificato.

    Il tipo di modifica viene descritto dalla ListChangedType proprietà del ListChangedEventArgs parametro . Di conseguenza, ogni volta che viene aggiornato il modello di dati, anche tutte le visualizzazioni dipendenti, ad esempio gli altri controlli associati alla stessa origine dati, verranno aggiornate. Tuttavia, gli oggetti contenuti nell'elenco dovranno notificare all'elenco quando cambiano in modo che l'elenco possa generare l'evento ListChanged .

    Nota

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

  • Interfaccia IBindingListView

    Una classe che implementa l'interfaccia IBindingListView fornisce tutte le funzionalità di un'implementazione di IBindingList, oltre a filtri e funzionalità di ordinamento avanzate. Questa implementazione offre filtri basati su stringhe e ordinamento a più colonne con coppie di descrittori di proprietà.This implementation offers string-based filtering, and multi-column sorting with property descriptor-direction pair.

  • Interfaccia IEditableObject

    Una classe che implementa l'interfaccia IEditableObject consente a un oggetto di controllare quando le modifiche apportate a tale oggetto vengono rese permanenti. Questa implementazione supporta i BeginEditmetodi , EndEdite CancelEdit che consentono di eseguire il rollback delle modifiche apportate all'oggetto . Di seguito è riportata una breve spiegazione del funzionamento dei BeginEditmetodi , EndEdite CancelEdit e di come interagiscono tra loro per consentire un possibile rollback delle modifiche apportate ai dati:

    • Il BeginEdit metodo segnala l'inizio di una modifica in un oggetto . Un oggetto che implementa questa interfaccia dovrà archiviare tutti gli aggiornamenti dopo la chiamata al BeginEdit metodo in modo che gli aggiornamenti possano essere eliminati se viene chiamato il CancelEdit metodo . Nel data binding Windows Forms è possibile chiamare BeginEdit più volte all'interno dell'ambito di una singola transazione di modifica ( ad esempio , BeginEdit, EndEditBeginEdit). Le implementazioni di IEditableObject devono tenere traccia del fatto che BeginEdit sia già stato chiamato e ignorare le chiamate successive a BeginEdit. Poiché questo metodo può essere chiamato più volte, è importante che le chiamate successive a esso non siano distruttive. Le chiamate successive BeginEdit non possono eliminare definitivamente gli aggiornamenti apportati o modificare i dati salvati nella prima BeginEdit chiamata.

    • Il EndEdit metodo esegue il push di tutte le modifiche apportate da quando BeginEdit è stato chiamato nell'oggetto sottostante, se l'oggetto è attualmente in modalità di modifica.

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

    Per altre informazioni sul funzionamento dei BeginEditmetodi , EndEdite CancelEdit , vedere Salvare di nuovo i dati nel database.

    Questa nozione transazionale di funzionalità dei dati viene usata dal DataGridView controllo .

  • Interfaccia ICancelAddNew

    Una classe che implementa l'interfaccia ICancelAddNew implementa in genere l'interfaccia IBindingList e consente di eseguire il rollback di un'aggiunta apportata all'origine dati con il AddNew metodo . Se l'origine dati implementa l'interfaccia IBindingList , è necessario implementare anche l'interfaccia ICancelAddNew .

  • Interfaccia IDataErrorInfo

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

    • La Error proprietà restituisce un testo generale del messaggio di errore, ad esempio "Si è verificato un errore".

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

  • Interfaccia IEnumerable

    Una classe che implementa l'interfaccia IEnumerable viene in genere utilizzata da ASP.NET. Windows Forms supporto per questa interfaccia è disponibile solo tramite il BindingSource componente .

    Nota

    Il BindingSource componente copia tutti gli IEnumerable elementi in un elenco separato a scopo di associazione.

  • Interfaccia ITypedList

    Classe di raccolte che implementa l'interfaccia ITypedList fornisce la funzionalità per controllare l'ordine e il set di proprietà esposte al controllo associato.

    Nota

    Quando si implementa il GetItemProperties metodo e la PropertyDescriptor matrice non è Null, l'ultima voce nella matrice sarà il descrittore di proprietà che descrive la proprietà list che è 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 viene usata per gli oggetti anziché per gli elenchi. Questa interfaccia viene usata da DataRowView per proiettare lo schema delle righe sottostanti. Una semplice implementazione di ICustomTypeDescriptor viene fornita dalla CustomTypeDescriptor classe .

    Nota

    Per supportare l'associazione in fase di progettazione ai tipi che implementano ICustomTypeDescriptor, il tipo deve anche implementare IComponent ed esistere come istanza del form.

  • Interfaccia IListSource

    Una classe che implementa l'interfaccia abilita l'associazione IListSource basata su elenco su oggetti non elenco. Il GetList metodo di IListSource viene usato per restituire un elenco associabile da un oggetto che non eredita da IList.IListSource viene usato dalla DataSet classe .

  • Interfaccia IRaiseItemChangedEvents

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

    Nota

    È necessario implementare se l'origine IRaiseItemChangedEvents dati fornisce la proprietà per elencare la conversione degli eventi descritta in precedenza e interagisce con il BindingSource componente. In caso contrario, verrà eseguita anche la BindingSource proprietà per elencare la conversione degli eventi con prestazioni più lente.

  • Interfaccia ISupportInitialize

    Un componente che implementa l'interfaccia sfrutta i vantaggi delle ottimizzazioni batch per l'impostazione delle proprietà e l'inizializzazione ISupportInitialize delle proprietà co-dipendenti. Contiene ISupportInitialize due metodi:

    • BeginInit segnala che l'inizializzazione dell'oggetto viene avviata.

    • EndInit segnala che l'inizializzazione dell'oggetto viene completata.

  • Interfaccia ISupportInitializeNotification

    Un componente che implementa l'interfaccia implementa anche l'interfaccia ISupportInitializeNotificationISupportInitialize . Questa interfaccia consente di inviare una notifica ad altri ISupportInitialize componenti che l'inizializzazione è stata completata. L'interfaccia ISupportInitializeNotification contiene due membri:

  • Interfaccia INotifyPropertyChanged

    Una classe che implementa questa interfaccia è un tipo che genera un evento quando uno dei valori delle proprietà viene modificato. Questa interfaccia è progettata per sostituire il criterio di disporre di un evento di modifica per ogni proprietà di un controllo. Se usato in un BindingList<T>oggetto business, un oggetto business deve implementare l'interfaccia INotifyPropertyChanged e bindingList'1 converte PropertyChanged gli eventi in ListChanged eventi di tipo ItemChanged.

    Nota

    Per la notifica delle modifiche da eseguire in un'associazione tra un client associato e un'origine dati, il tipo di origine dati associato deve implementare l'interfaccia INotifyPropertyChanged (preferita) oppure è possibile fornire eventi propertyNameChanged per il tipo associato, ma non è consigliabile eseguire entrambe le operazioni.

Interfacce per l'implementazione da parte degli autori di componenti

Le interfacce seguenti sono progettate per l'uso da parte del motore di data-binding di Windows Forms:

  • Interfaccia IBindableComponent

    Una classe che implementa questa interfaccia è un componente di non-controllo che supporta il data-binding. Questa classe restituisce i data binding e il contesto di associazione del componente tramite le DataBindings proprietà e BindingContext di questa interfaccia.

    Nota

    Se il componente eredita da Control, non è necessario implementare l'interfaccia IBindableComponent .

  • Interfaccia ICurrencyManagerProvider

    Una classe che implementa l'interfaccia ICurrencyManagerProvider è un componente che fornisce il proprio CurrencyManager per gestire le associazioni associate a questo particolare componente. L'accesso CurrencyManager alla personalizzata CurrencyManager viene fornito dalla proprietà .

    Nota

    Classe che eredita da Control gestisce automaticamente le associazioni tramite la relativa BindingContext proprietà, quindi i casi in cui è necessario implementare l'oggetto ICurrencyManagerProvider sono piuttosto rari.

Origini dati supportate da Windows Forms

Tradizionalmente, il data binding è stato usato all'interno di applicazioni per sfruttare i dati archiviati nei database. Con Windows Forms data binding, è possibile accedere ai dati dai database e dai dati in altre strutture, ad esempio matrici e raccolte, purché siano stati soddisfatti determinati requisiti minimi.

Strutture da associare a

In Windows Forms è possibile associare a un'ampia gamma di strutture, da oggetti semplici (binding semplice) a elenchi complessi, ad esempio ADO.NET tabelle dati (associazione complessa). Per un'associazione semplice, Windows Forms supportare l'associazione alle proprietà pubbliche nell'oggetto semplice. Windows Forms associazione basata su elenco richiede in genere che l'oggetto supporti l'interfaccia o l'interfaccia IListIListSource. Inoltre, se si esegue l'associazione tramite un componente, è possibile associare a un BindingSource oggetto che supporta l'interfaccia IEnumerable .

L'elenco seguente mostra le strutture a cui è possibile eseguire il binding in Windows Forms.

  • BindingSource

    Un BindingSource è l'origine dati più comune Windows Forms e agisce un proxy tra un'origine dati e i controlli Windows Forms. Il modello di utilizzo generale BindingSource consiste nell'associare BindingSource i controlli all'origine dati e associarlo all'origine BindingSource dati, ad esempio una tabella dati ADO.NET o un oggetto business. BindingSource Fornisce servizi che consentono e migliorano il livello di supporto del data binding. Ad esempio, Windows Forms controlli basati su elenco, ad esempio e ComboBox non supportano direttamente l'associazione DataGridView alle IEnumerable origini dati, tuttavia, è possibile abilitare questo scenario tramite l'associazione tramite un BindingSourceoggetto . In questo caso, l'origine BindingSource dati verrà convertita in un IListoggetto .

  • Oggetti semplici

    Windows Forms supportare le proprietà del controllo di data binding alle proprietà pubbliche nell'istanza di un oggetto usando il Binding tipo. Windows Forms supporta anche i controlli basati sull'elenco di associazioni, ad esempio un'istanza di un ListControl oggetto quando viene usato un oggettoBindingSource.

  • Matrice o raccolta

    Per fungere da origine dati, un elenco deve implementare l'interfaccia IList . Un esempio è una matrice che è un'istanza della Array classe. Per altre informazioni sulle matrici, vedere Procedura: Creare una matrice di oggetti (Visual Basic).

    In generale, è consigliabile usare BindingList<T> quando si creano elenchi di oggetti per il data binding. BindingList è una versione generica dell'interfaccia IBindingList . L'interfaccia IBindingList estende l'interfaccia IList aggiungendo proprietà, metodi ed eventi necessari per il data binding bidirezionale.

  • IEnumerable

    Windows Forms controlli possono essere associati a origini dati che supportano solo l'interfaccia IEnumerable se sono associate tramite un BindingSource componente.

  • oggetti dati ADO.NET

    ADO.NET fornisce molte strutture di dati adatte per l'associazione. Ognuno varia nella sua sofisticatezza e complessità.

    • DataColumn

      Un DataColumn è il blocco predefinito essenziale di , DataTablein cui più colonne costituiscono una tabella. Ogni DataColumn oggetto ha una DataType proprietà che determina il tipo di dati che la colonna contiene , ad esempio la forma di un'automobile in una tabella che descrive le auto. È possibile associare un controllo (ad esempio TextBox la proprietà di Text un controllo) a una colonna all'interno di una tabella dati.

    • DataTable

      Una DataTable è la rappresentazione di una tabella, con righe e colonne, in ADO.NET. Una tabella dati contiene due raccolte: DataColumn, che rappresenta le colonne di dati in una determinata tabella (che determinano in definitiva i tipi di dati che possono essere immessi in tale tabella) e DataRow, che rappresenta le righe di dati in una determinata tabella. È possibile associare un controllo alle informazioni contenute in una tabella dati, ad esempio associando il DataGridView controllo a una tabella dati. Tuttavia, quando si esegue il binding a un DataTableoggetto , si è un'associazione alla visualizzazione predefinita della tabella.

    • DataView

      Un DataView oggetto è una visualizzazione personalizzata di una singola tabella dati che può essere filtrata o ordinata. Una visualizzazione dati è lo "snapshot" dei dati usato dai controlli associati a complessi. È possibile associare in modo semplice o complesso ai dati all'interno di una visualizzazione dati, ma si noti che si sta associando a un 'immagine' fissa dei dati anziché a un'origine dati pulita e aggiornata.

    • DataSet

      Un DataSet oggetto è una raccolta di tabelle, relazioni e vincoli dei dati in un database. È possibile associare in modo semplice o complesso ai dati all'interno di un set di dati, ma si noti che si sta associando all'impostazione predefinita DataViewManager per l'oggetto DataSet (vedere il punto elenco successivo).

    • DataViewManager

      Un DataViewManager oggetto è una visualizzazione personalizzata dell'intero DataSet, analogo a un DataViewoggetto , ma con le relazioni incluse. Con una DataViewSettings raccolta, è possibile impostare filtri predefiniti e opzioni di ordinamento per le visualizzazioni che DataViewManager hanno per una determinata tabella.

Tipi di data binding

Nei Windows Form è possibile usare due tipi di data binding, ovvero l'associazione semplice e l'associazione complessa. I due tipi presentano vantaggi diversi.

Tipo di data binding Descrizione
Data binding semplice Capacità di un controllo di eseguire l'associazione a un singolo elemento di dati, ad esempio il valore di una colonna in una tabella di dataset. Il data binding semplice è il tipo di associazione tipico per i controlli, ad esempio un controllo o Label un TextBox controllo, che sono in genere controlli che in genere visualizzano un singolo valore. In realtà è possibile associare qualsiasi proprietà di un controllo a un campo di un database. È disponibile un supporto completo per questa funzionalità in Visual Studio.

Per altre informazioni, vedere Esplorare i dati e creare un controllo associato semplice (Windows Forms .NET).
Data binding complesso Capacità di un controllo di eseguire l'associazione a più di un elemento di dati, in genere a più record di un database. L'associazione complessa viene detta anche associazione basata su elenchi. Tra i controlli di esempio che supportano l'associazione complessa sono annoverati i controlli DataGridView, ListBox e ComboBox. Per un esempio di data binding complesso, vedere Procedura: Associare un controllo ComboBox Windows Forms o ListBox ai dati.

Componente origine di associazione

Per semplificare il data binding, Windows Form consente di associare un'origine dati al componente BindingSource e poi di associare i controlli alla classe BindingSource. È possibile usare la classe BindingSource in scenari di associazione semplice o complessa. In entrambi i casi, la classe BindingSource agisce da intermediaria tra l'origine dati e i controlli associati fornendo la notifica delle modifiche, la gestione della diffusione dei dati e altri servizi.

Scenari comuni che usano il data binding

In quasi tutte le applicazioni commerciali vengono usate informazioni che sono lette da origini dati di un determinato tipo, generalmente tramite data binding. Nell'elenco seguente sono illustrati gli scenari più comuni in cui viene usato il data binding per la presentazione e la manipolazione dei dati.

Scenario Descrizione
Creazione di report I report forniscono una soluzione flessibile per la visualizzazione e il riepilogo dei dati in un documento stampato. È comune creare un report che stampa il contenuto selezionato di un'origine dati sullo schermo o su una stampante. I report più comuni includono elenchi, fatture e riepiloghi. Gli elementi vengono formattati in colonne di elenchi, con elementi secondari organizzati in ogni elemento dell'elenco, ma è consigliabile scegliere il layout più adatto ai dati.
Immissione di dati Un metodo comunemente impiegato per immettere elevate quantità di dati correlati o per richiedere informazioni agli utenti consiste nell'utilizzo di un form per l'immissione dei dati. Gli utenti possono immettere le informazioni o selezionare le opzioni usando caselle di testo, pulsanti di opzione, elenchi a discesa e caselle di controllo. Le informazioni vengono quindi inviate e archiviate in un database, la cui struttura si basa sulle informazioni immesse.
Relazione Master-Details Un'applicazione Master-Details rappresenta un formato per la presentazione di dati correlati. In particolare, esistono due tabelle di dati con una relazione che si connette nell'esempio aziendale classico, una tabella "Customers" e una tabella "Orders" con una relazione tra i clienti e i rispettivi ordini. Per altre informazioni sulla creazione di un'applicazione master/dettaglio con due controlli Windows FormsDataGridView, vedere Procedura: Creare un modulo master/dettaglio usando due controlli DataGridView Windows Forms
Tabella di ricerca Un altro scenario comune di presentazione e manipolazione dei dati è rappresentato dalla tabella di ricerca. Nell'ambito della visualizzazione di un'elevata quantità di dati viene spesso usato un controllo ComboBox per visualizzare e manipolare i dati. I dati visualizzati nel controllo ComboBox sono diversi dai dati scritti nel database. Se ad esempio è presente un controllo ComboBox che visualizza i prodotti disponibili in un negozio di alimentari, probabilmente si vorranno visualizzare i nomi dei prodotti, quali pane, latte, uova e così via. Per facilitare tuttavia il recupero delle informazioni all'interno del database e per la normalizzazione del database, le informazioni per i prodotti specifici di un determinato ordine verranno probabilmente archiviate come numeri, ad esempio 501, 603 e così via. Pertanto, esiste una connessione implicita tra il "nome descrittivo" dell'articolo di alimentari nel controllo nel ComboBox modulo e il numero di articolo correlato presente in un ordine. È l'essenza di una ricerca di tabella. Per altre informazioni, vedere Procedura: Creare una tabella di ricerca con il componente BindingSource Windows Forms.

Vedi anche