Condividi tramite


Associazione di oggetti in Visual Studio

Aggiornamento: novembre 2007

Visual Studio fornisce strumenti in fase di progettazione che consentono di utilizzare oggetti personalizzati (invece di dataset e servizi Web) come origine dati nell'applicazione in uso.

Per utilizzare gli strumenti di progettazione dati in Visual Studio, è necessario unicamente che l'oggetto disponga di almeno una proprietà pubblica. Non sono richiesti attributi o costruttori specifici per l'utilizzo degli oggetti personalizzati con strumenti quali la finestra 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 da un insieme

  • Visualizzazione agli utenti dei dati degli oggetti in un form

  • Variazione/modifica dei dati in 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 di oggetti. 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 di oggetti.

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 dal 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 di oggetti.

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

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 di un oggetto.

Per ulteriori informazioni sulla visualizzazione di dati degli oggetti in Windows Forms, vedere Visualizzazione di dati su form nelle applicazioni Windows.

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 di oggetto 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 riconciliare 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 di un oggetto

Procedura dettagliata: connessione ai dati di oggetti

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

Altre risorse

Visualizzazione di dati su form nelle applicazioni Windows

TableAdapter

Salvataggio di dati