Panoramica del data binding (Windows Form .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 forniscano o utilizzano dati in Windows Form. 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 Form o i componenti, implementano queste interfacce. Il secondo gruppo di interfacce è 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 associazione dati Windows Form. È 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. Gli strumenti di progettazione rapida delle applicazioni (RAD) di Visual Studio sfruttano già questa funzionalità.

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

I controlli Windows Form implementano le interfacce seguenti:

  • IList Interfaccia

    Una classe che implementa l'interfaccia IList può essere un Arrayoggetto , ArrayListo 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 desidera creare un elenco di oggetti business per l'associazione con Windows Form, è consigliabile usare .BindingList<T> BindingList è una classe estendibile che implementa le interfacce primarie necessarie per il data binding bidirezionale Windows Form.

  • IBindingList Interfaccia

    Una classe che implementa l'interfaccia IBindingList fornisce un livello molto superiore 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

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

  • IBindingListView Interfaccia

    Una classe che implementa l'interfaccia IBindingListView fornisce tutte le funzionalità di un'implementazione di IBindingList, insieme al filtro e alla funzionalità di ordinamento avanzato. Questa implementazione offre filtri basati su stringhe e l'ordinamento a più colonne con coppie di descrittori di proprietà.

  • IEditableObject Interfaccia

    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 del relativo funzionamento uno con l'altro 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 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 Form è possibile chiamare BeginEdit più volte nell'ambito di una singola transazione di modifica ( ad esempio , BeginEditBeginEdit, EndEdit). 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 eseguiti o modificare i dati salvati nella prima BeginEdit chiamata.

    • Il metodo esegue il EndEdit push delle 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 i dati nel database.

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

  • ICancelAddNew Interfaccia

    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 .

  • IDataErrorInfo Interfaccia

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

    • La Error proprietà restituisce il 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".

  • IEnumerable Interfaccia

    Una classe che implementa l'interfaccia IEnumerable viene in genere utilizzata da ASP.NET. Windows Form 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.

  • ITypedList Interfaccia

    Una 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.

  • ICustomTypeDescriptor Interfaccia

    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 modulo.

  • IListSource Interfaccia

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

  • IRaiseItemChangedEvents Interfaccia

    Una classe che implementa l'interfaccia IRaiseItemChangedEvents è un elenco associabile che implementa anche l'interfaccia IBindingList . Questa interfaccia viene utilizzata 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 di 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.

  • ISupportInitialize Interfaccia

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

    • BeginInit segnala che l'inizializzazione dell'oggetto è in fase di avvio.

    • EndInit segnala che l'inizializzazione dell'oggetto sta terminando.

  • ISupportInitializeNotification Interfaccia

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

  • INotifyPropertyChanged Interfaccia

    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 , BindingList<T>un oggetto business deve implementare l'interfaccia INotifyPropertyChanged e BindingList'1 convertirà PropertyChanged gli eventi in ListChanged eventi di tipo ItemChanged.

    Nota

    Affinché la notifica di modifica venga eseguita 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:

  • IBindableComponent Interfaccia

    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 .

  • ICurrencyManagerProvider Interfaccia

    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 all'oggetto personalizzato CurrencyManager viene fornito dalla CurrencyManager proprietà .

    Nota

    Una classe che eredita da Control gestisce automaticamente le associazioni tramite la relativa BindingContext proprietà, pertanto i casi in cui è necessario implementare sono ICurrencyManagerProvider piuttosto rari.

Origini dati supportate da Windows Form

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

Strutture da associare a

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

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

  • BindingSource

    Un BindingSource è l'origine dati Windows Form più comune e agisce un proxy tra un'origine dati e i controlli Windows Form. Il modello di utilizzo generale BindingSource consiste nell'associare i controlli a BindingSource e associare l'oggetto BindingSource all'origine 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 Form 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 oggetto BindingSource. In questo caso, l'oggetto BindingSource convertirà l'origine dati in un oggetto IList.

  • Oggetti semplici

    Windows Form supportano le proprietà del controllo di associazione dati alle proprietà pubbliche nell'istanza di un oggetto usando il Binding tipo . Windows Form supportano anche controlli basati sull'elenco di associazioni, ad esempio un ListControl oggetto a un'istanza di oggetto quando viene usato un oggetto BindingSource .

  • 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).For more information on arrays, see How to: Create an Array of Objects (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 aggiungendo proprietà, metodi ed eventi necessari per il IList data binding bidirezionale.

  • IEnumerable

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

  • ADO.NET oggetti dati

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

    • DataColumn

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

    • DataTable

      È DataTable la rappresentazione di una tabella, con righe e colonne, in ADO.NET. Una tabella di dati contiene due raccolte: DataColumn, che rappresenta le colonne di dati in una determinata tabella (che determina infine 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 in modo complesso alle informazioni contenute in una tabella dati, ad esempio associare 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 vista personalizzata di una singola tabella dati che può essere filtrata o ordinata. Una vista dati è lo "snapshot" dei dati usato dai controlli associati a complessi. È possibile eseguire l'associazione semplice o complessa ai dati all'interno di una vista dati, ma si noti che si esegue il binding 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 eseguire l'associazione semplice o complessa ai dati all'interno di un set di dati, ma si noti che si esegue il binding all'impostazione predefinita DataViewManager per ( DataSet vedere il punto punto elenco successivo).

    • DataViewManager

      Un DataViewManager oggetto è una visualizzazione personalizzata dell'intero DataSetoggetto , analogo a un DataViewoggetto , ma con le relazioni incluse. Con una DataViewSettings raccolta, è possibile impostare i filtri predefiniti e le opzioni di ordinamento per tutte le DataViewManager visualizzazioni disponibili 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 controlli che in genere visualizzano solo un singolo valore. In realtà è possibile associare qualsiasi proprietà di un controllo a un campo di un database. È disponibile un ampio supporto per questa funzionalità in Visual Studio.

Per altre informazioni, vedere Esplorare i dati e Creare un controllo con associazione semplice (Windows Form .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 o ListBox Windows Form ai dati.

Componente di origine dell'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 voce di elenco, ma è consigliabile scegliere il layout più adatto ai dati.
Immissione 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, sono presenti 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 FormDataGridView, vedere Procedura: Creare un modulo master/dettaglio usando due controlli DataGridView Windows Form
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 Form.

Vedi anche