Associazione di oggetti in Visual Studio

Visual Studio fornisce strumenti in fase di progettazione che consentono di utilizzare oggetti personalizzati (anziché altre origini dati, quali entità, dataset e servizi) come origine dati nell'applicazione in uso.

Requisiti degli oggetti

Per utilizzare gli strumenti di progettazione dati in Visual Studio, è necessario unicamente che l'oggetto disponga di almeno una proprietà pubblica.

Per essere utilizzati come origine dati per un'applicazione, generalmente gli oggetti personalizzati non richiedono un'interfaccia, costruttori o attributi specifici. Se tuttavia si desidera trascinare l'oggetto dalla finestra Origini dati in un'area di progettazione per creare un controllo associato a dati, e se l'oggetto implementa l'interfaccia ITypedList o IListSource, l'oggetto deve disporre di un costruttore predefinito (ovvero, un costruttore senza parametri). In caso contrario, Visual Studio non sarà in grado di creare un'istanza dell'oggetto origine dati e verrà visualizzato un errore quando si trascina l'elemento nell'area di progettazione.

Esempi dell'utilizzo di oggetti personalizzati come origini dati

Sebbene esistano molti metodi per implementare la logica dell'applicazione quando si utilizzano oggetti quali un'origine dati, le operazioni standard che è possibile semplificare utilizzando i nuovi oggetti TableAdapter generati in VIsual Studio sono poche. In questa pagina viene spiegato come implementare questi processi standard utilizzando i TableAdapter; la pagina non è destinata a essere una guida per la creazione di oggetti personalizzati. Ad esempio, le operazioni standard riportate di seguito saranno utilizzate indipendentemente dall'implementazione specifica degli oggetti o dalla logica dell'applicazione:

  • Caricamento dei dati negli oggetti (in genere da un database).

  • Creazione di un insieme tipizzato di oggetti.

  • Aggiunta e rimozione di oggetti in un insieme.

  • Visualizzazione agli utenti dei dati degli oggetti in un form.

  • Variazione/modifica dei dati in un oggetto.

  • Salvataggio dei dati dagli oggetti al database.

Nota

Per una migliore comprensione di tale procedura e per fornire un contesto per gli esempi di questa pagina, si consiglia di completare la seguente procedura: Procedura dettagliata: connessione ai dati negli oggetti (Windows Form). Mediante tale procedura dettagliata è possibile creare gli oggetti di cui si è trattato in questa pagina della Guida.

Caricamento dei dati negli oggetti

Per questo esempio, caricare i dati negli oggetti in uso utilizzando i TableAdapter. Per impostazione predefinita, i TableAdapter sono creati con due tipi di metodo che consentono di recuperare i dati da un database e compilare tabelle dati.

  • Il metodo TableAdapter.Fill consente di riempire una tabella dati esistente con i dati restituiti.

  • Il metodo TableAdapter.GetData consente di restituire una nuova tabella dati compilata con dati.

Il modo più semplice per caricare gli oggetti personalizzati con i dati consiste nel chiamare il metodo TableAdapter.GetData, scorrere l'insieme di righe della tabella dati restituita e popolare ciascun oggetto con i valori in ciascuna riga. È possibile creare un metodo GetData che restituisce una tabella dati compilata per le query aggiunte a un TableAdapter.

Nota

In Visual Studio, le query del TableAdapter sono denominate Fill e GetData per impostazione predefinita; tuttavia tali nomi possono essere modificati in qualsiasi nome di metodo valido.

Nell'esempio riportato di seguito viene illustrato come scorrere le righe di una tabella dati e compilare un oggetto con i dati:

Per un esempio di codice completo, vedere Procedura dettagliata: connessione ai dati negli oggetti (Windows Form).

Private Sub LoadCustomers()
    Dim customerData As NorthwindDataSet.CustomersDataTable =
        CustomersTableAdapter1.GetTop5Customers()

    Dim customerRow As NorthwindDataSet.CustomersRow

    For Each customerRow In customerData
        Dim currentCustomer As New Customer()
        With currentCustomer

            .CustomerID = customerRow.CustomerID
            .CompanyName = customerRow.CompanyName

            If Not customerRow.IsAddressNull Then
                .Address = customerRow.Address
            End If

            If Not customerRow.IsCityNull Then
                .City = customerRow.City
            End If

            If Not customerRow.IsContactNameNull Then
                .ContactName = customerRow.ContactName
            End If

            If Not customerRow.IsContactTitleNull Then
                .ContactTitle = customerRow.ContactTitle
            End If

            If Not customerRow.IsCountryNull Then
                .Country = customerRow.Country
            End If

            If Not customerRow.IsFaxNull Then
                .Fax = customerRow.Fax
            End If

            If Not customerRow.IsPhoneNull Then
                .Phone = customerRow.Phone
            End If

            If Not customerRow.IsPostalCodeNull Then
                .PostalCode = customerRow.PostalCode
            End If

            If Not customerRow.Is_RegionNull Then
                .Region = customerRow._Region
            End If

        End With

        LoadOrders(currentCustomer)
        CustomerBindingSource.Add(currentCustomer)
    Next
End Sub
private void LoadCustomers()
{
    NorthwindDataSet.CustomersDataTable customerData = 
        customersTableAdapter1.GetTop5Customers();

    foreach (NorthwindDataSet.CustomersRow customerRow in customerData)
    {
        Customer currentCustomer = new Customer();
        currentCustomer.CustomerID = customerRow.CustomerID;
        currentCustomer.CompanyName = customerRow.CompanyName;

        if (customerRow.IsAddressNull() == false)
        {
            currentCustomer.Address = customerRow.Address;
        }

        if (customerRow.IsCityNull() == false)
        {
            currentCustomer.City = customerRow.City;
        }

        if (customerRow.IsContactNameNull() == false)
        {
            currentCustomer.ContactName = customerRow.ContactName;
        }

        if (customerRow.IsContactTitleNull() == false)
        {
            currentCustomer.ContactTitle = customerRow.ContactTitle;
        }

        if (customerRow.IsCountryNull() == false)
        {
            currentCustomer.Country = customerRow.Country;
        }

        if (customerRow.IsFaxNull() == false)
        {
            currentCustomer.Fax = customerRow.Fax;
        }

        if (customerRow.IsPhoneNull() == false)
        {
            currentCustomer.Phone = customerRow.Phone;
        }

        if (customerRow.IsPostalCodeNull() == false)
        {
            currentCustomer.PostalCode = customerRow.PostalCode;
        }

        if (customerRow.IsRegionNull() == false)
        {
            currentCustomer.Region = customerRow.Region;
        }

        LoadOrders(currentCustomer);
        customerBindingSource.Add(currentCustomer);
    }
}

Creazione di un insieme tipizzato di oggetti

È possibile creare classi di oggetti per gli oggetti in uso oppure utilizzare gli insiemi tipizzati forniti in modo automatico da Il componente BindingSource.

Quando si crea una classe di insiemi personalizzata, è opportuno ereditarla dall'oggetto BindingList<T>. Questa classe generica fornisce sia la funzionalità per amministrare l'insieme, sia la possibilità di generare eventi che inviano notifiche all'infrastruttura di associazione dati in Windows Forms.

Nell'insieme generato in modo automatico nell'oggetto BindingSource viene utilizzato un oggetto BindingList<T> per il relativo insieme tipizzato. Se l'applicazione non richiede alcuna funzionalità aggiuntiva, sarà possibile mantenere l'insieme all'interno dell'oggetto BindingSource. Per ulteriori informazioni, vedere la proprietà List della classe BindingSource.

Nota

Se nell'insieme saranno richieste funzionalità non fornite dall'implementazione di base dell'oggetto BindingList<T>, sarà necessario creare un insieme personalizzato in modo da effettuare l'aggiunta alla classe come richiesto.

Nel codice riportato di seguito viene illustrato come creare la classe per un insieme fortemente tipizzato di oggetti Order:

''' <summary>
''' A collection of Orders
''' </summary>
Public Class Orders
    Inherits System.ComponentModel.BindingList(Of Order)

    ' Add any additional functionality required by your collection.

End Class
/// <summary>
/// A collection of Orders
/// </summary>
public class Orders: System.ComponentModel.BindingList<Order>
{
    // Add any additional functionality required by your collection.
}

Aggiunta di oggetti a un insieme

Gli oggetti vengono aggiunti a un insieme chiamando il metodo Add della classe di insiemi personalizzata oppure dell'oggetto BindingSource.

Per un esempio di aggiunta a un insieme mediante un oggetto BindingSource, vedere il metodo LoadCustomers in Procedura dettagliata: connessione ai dati negli oggetti (Windows Form).

Per un esempio di aggiunta di oggetti a un insieme personalizzato, vedere il metodo LoadOrders in Procedura dettagliata: connessione ai dati negli oggetti (Windows Form).

Nota

Il metodo Add viene fornito automaticamente per l'insieme personalizzati quando si eredita dall'oggetto BindingList<T>.

Nel codice riportato di seguito viene illustrato come aggiungere oggetti all'insieme tipizzato in un oggetto BindingSource:

Dim currentCustomer As New Customer()
CustomerBindingSource.Add(currentCustomer)
Customer currentCustomer = new Customer();
customerBindingSource.Add(currentCustomer);

Nel codice riportato di seguito viene illustrato come aggiungere oggetti a un insieme tipizzato che eredita da un oggetto BindingList<T>:

Nota

In questo esempio l'insieme Orders è una proprietà dell'oggetto Customer.

Dim currentOrder As New Order()
currentCustomer.Orders.Add(currentOrder)
Order currentOrder = new Order();
currentCustomer.Orders.Add(currentOrder);

Rimozione degli oggetti da un insieme

Gli oggetti vengono rimossi da un insieme chiamando il metodo Remove oppure RemoveAt della classe di insiemi personalizzata oppure dell'oggetto BindingSource.

Nota

I metodi Remove e RemoveAt sono forniti automaticamente per l'insieme personalizzato quando si eredita dall'oggetto BindingList<T>.

Nel codice riportato di seguito viene illustrato come individuare e rimuovere gli oggetti dall'insieme tipizzato in un oggetto BindingSource con il metodo RemoveAt:

Dim customerIndex As Integer = CustomerBindingSource.Find("CustomerID", "ALFKI")
CustomerBindingSource.RemoveAt(customerIndex)
int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);

Visualizzazione dei dati degli oggetti agli utenti

Per visualizzare agli utenti i dati presenti negli oggetti, è necessario creare un'origine dati oggetti utilizzando Configurazione guidata origine dati e quindi trascinare l'intero oggetto o le singole proprietà nel form dalla finestra Origini dati.

Per ulteriori informazioni sulla creazione di un'origine dati oggetti, vedere Procedura: connettersi ai dati negli oggetti.

Per ulteriori informazioni sulla visualizzazione di dati degli oggetti in Windows Forms, vedere Associazione di controlli ai dati in Visual Studio.

Modifica dei dati negli oggetti

Per modificare i dati negli oggetti personalizzati con associazione a dati ai controlli Windows Form, è sufficiente modificare i dati nel controllo associato (oppure direttamente nelle proprietà dell'oggetto). L'architettura di associazione dati aggiornerà i dati nell'oggetto.

Se nell'applicazione è richiesta la traccia delle modifiche e il rollback delle modifiche proposte ai relativi valori originali, sarà necessario implementare questa funzionalità nel modello a oggetti in uso. Per esempi del modo in cui nelle tabelle dati viene tenuta traccia delle modifiche proposte, vedere DataRowState, HasChanges e GetChanges.

Salvataggio dei dati dagli oggetti al database

I dati vengono salvati nel database passando i valori dall'oggetto personalizzato ai metodi DBDirect del TableAdapter.

Visual Studio consente la creazione di metodi DBDirect che è possibile eseguire direttamente sul database. Questi metodi non richiedono oggetti DataSet o DataTable.

Metodo DBDirect di TableAdapter

Descrizione

TableAdapter.Insert

Aggiunge nuovi record a un database e consente di passare valori di colonna singoli come parametri di metodo.

TableAdapter.Update

Aggiorna i record esistenti in un database Il metodo Update accetta valori di colonna originali e quelli nuovi come parametri di metodo. I valori originali sono utilizzati per individuare il record originale, mentre i valori nuovi sono utilizzati per aggiornarlo.

Il metodo TableAdapter.Update è anche utilizzato per risolvere le differenze tra le modifiche apportate a un dataset e il database utilizzando un oggetto DataSet, DataTable, DataRow, oppure una matrice di oggetti DataRow come parametri di metodo.

TableAdapter.Delete

Elimina i record esistenti dal database in base ai valori di colonna originali passati come parametri di metodo.

Per salvare i dati di un insieme di oggetti, scorrere l'insieme di oggetti (ad esempio, utilizzando un ciclo For-Next) e inviare i valori per ciascun oggetto al database utilizzando i metodi DBDirect del TableAdapter.

Nell'esempio riportato di seguito viene illustrato come utilizzare il metodo DBDirect TableAdapter.Insert per aggiungere un nuovo cliente direttamente nel database:

Private Sub AddNewCustomer(ByVal currentCustomer As Customer)

    CustomersTableAdapter.Insert(
        currentCustomer.CustomerID,
        currentCustomer.CompanyName,
        currentCustomer.ContactName,
        currentCustomer.ContactTitle,
        currentCustomer.Address,
        currentCustomer.City,
        currentCustomer.Region,
        currentCustomer.PostalCode,
        currentCustomer.Country,
        currentCustomer.Phone,
        currentCustomer.Fax)
End Sub
private void AddNewCustomers(Customer currentCustomer)
{
    customersTableAdapter.Insert( 
        currentCustomer.CustomerID, 
        currentCustomer.CompanyName, 
        currentCustomer.ContactName, 
        currentCustomer.ContactTitle, 
        currentCustomer.Address, 
        currentCustomer.City, 
        currentCustomer.Region, 
        currentCustomer.PostalCode, 
        currentCustomer.Country, 
        currentCustomer.Phone, 
        currentCustomer.Fax);
}

Vedere anche

Attività

Procedura: connettersi ai dati negli oggetti

Procedura dettagliata: connessione ai dati negli oggetti (Windows Form)

Procedura: salvare dati da un oggetto in un database

Procedura: accedere direttamente al database mediante un oggetto TableAdapter

Procedura dettagliata: salvataggio di dati con i metodi DBDirect di TableAdapter

Concetti

Associazione di controlli ai dati in Visual Studio

Altre risorse

TableAdapters

Salvataggio di dati