Binda objekt som datakällor i .NET Framework-program med hjälp av Visual Studio

Anmärkning

Klassen DataSet och relaterade klasser är äldre .NET Framework-tekniker från början av 2000-talet som gör det möjligt för program att arbeta med data i minnet medan apparna kopplas från databasen. Teknikerna är särskilt användbara för appar som gör det möjligt för användare att ändra data och spara ändringarna tillbaka till databasen. Även om datauppsättningar är en bevisad framgångsrik teknik är den rekommenderade metoden för nya .NET-program att använda Entity Framework Core. Entity Framework är ett mer naturligt sätt att arbeta med tabelldata som objektmodeller och har ett enklare programmeringsgränssnitt.

Visual Studio innehåller designtidsverktyg för att arbeta med anpassade objekt som datakälla i ditt program. När du vill lagra data från en databas i ett objekt som du binder till användargränssnittskontroller är den rekommenderade metoden att använda Entity Framework för att generera klassen eller klasserna. Entity Framework genererar automatiskt all ändringsspårningskod för boilerplate, vilket innebär att alla ändringar i de lokala objekten sparas automatiskt i databasen när du anropar AcceptChanges på DbSet-objektet. Mer information finns i Dokumentation om Entity Framework.

Tips/Råd

Metoderna för objektbindning i den här artikeln bör endast beaktas om ditt program redan baseras på datauppsättningar. Du kan också använda dessa metoder om du redan är bekant med datauppsättningar, och de data du kommer att bearbeta är tabellbaserade och inte för komplexa eller för stora. Ett ännu enklare exempel, där du läser in data direkt i objekt med hjälp av en DataReader och uppdaterar användargränssnittet manuellt utan databindning, finns i Skapa ett enkelt dataprogram med hjälp av ADO.NET.

Objektkrav

Det enda kravet för anpassade objekt att fungera med datadesignverktygen i Visual Studio är att objektet behöver minst en offentlig egenskap.

I allmänhet kräver anpassade objekt inte några specifika gränssnitt, konstruktorer eller attribut för att fungera som datakälla för ett program. Men om du vill dra objektet från fönstret Datakällor till en designyta för att skapa en databunden kontroll, och om objektet implementerar ITypedList gränssnittet eller IListSource måste objektet ha en standardkonstruktor. Annars kan Visual Studio inte instansiera datakällans objekt, och det visar ett fel när du drar objektet till designytan.

Exempel på hur du använder anpassade objekt som datakällor

Det finns otaliga sätt att implementera din programlogik när du arbetar med objekt som datakälla, men för SQL-databaser finns det några standardåtgärder som kan förenklas med hjälp av Visual Studio-genererade TableAdapter-objekt. På den här sidan beskrivs hur du implementerar dessa standardprocesser med TableAdapters. Det är inte avsett som en guide för att skapa dina anpassade objekt. Du utför till exempel vanligtvis följande standardåtgärder oavsett den specifika implementeringen av dina objekt eller programmets logik:

  • Läser in data i objekt (vanligtvis från en databas).

  • Skapa en typad samling objekt.

  • Lägga till objekt i och ta bort objekt från en samling.

  • Visa objektdata för användare i ett formulär.

  • Ändra/redigera data i ett objekt.

  • Spara data från objekt tillbaka till databasen.

Läsa in data i objekt

I det här exemplet läser du in data i dina objekt med hjälp av TableAdapters. Som standard skapas TableAdapters med två typer av metoder som hämtar data från en databas och fyller i datatabeller.

  • Metoden TableAdapter.Fill fyller en befintlig datatabell med de data som returneras.

  • Metoden TableAdapter.GetData returnerar en ny datatabell som fylls med data.

Det enklaste sättet att läsa in dina anpassade objekt med data är att anropa TableAdapter.GetData metoden, loopa igenom samlingen rader i den returnerade datatabellen och fylla i varje objekt med värdena på varje rad. Du kan skapa en GetData metod som returnerar en ifylld datatabell för alla frågor som läggs till i en TableAdapter.

Anmärkning

Visual Studio namnger TableAdapter-frågorna Fill och GetData som standard, men du kan ändra dessa namn till valfritt giltigt metodnamn.

I följande exempel visas hur du loopar igenom raderna i en datatabell och fyller i ett objekt med data:

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);
    }
}

Skapa en typad samling objekt

Du kan skapa samlingsklasser för dina objekt eller använda de skrivna samlingarna som automatiskt tillhandahålls av BindingSource-komponenten.

När du skapar en anpassad samlingsklass för objekt föreslår vi att du ärver från BindingList<T>. Den här allmänna klassen innehåller funktioner för att administrera din samling, samt möjligheten att skapa händelser som skickar meddelanden till databindningsinfrastrukturen i Windows Forms.

Den automatiskt genererade samlingen i BindingSource använder en BindingList<T> för sin typade samling. Om programmet inte kräver ytterligare funktioner kan du underhålla samlingen i BindingSource. Mer information finns i List egenskapen för BindingSource klassen.

Anmärkning

Om din samling kräver funktioner som inte tillhandahålls av basimplementeringen av BindingList<T>bör du skapa en anpassad samling så att du kan lägga till i klassen efter behov.

Följande kod visar hur du skapar klassen för en starkt typbaserad samling Order objekt:

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

Lägga till objekt i en samling

Du lägger till objekt i en samling genom att anropa metoden för Add din anpassade samlingsklass eller för BindingSource.

Anmärkning

Metoden Add tillhandahålls automatiskt för din anpassade samling när du ärver från BindingList<T>.

Följande kod visar hur du lägger till objekt i den typerade samlingen i en BindingSource:

Customer currentCustomer = new Customer();
customerBindingSource.Add(currentCustomer);

Följande kod visar hur du lägger till objekt i en typad samling som ärver från BindingList<T>:

Anmärkning

I det här exemplet är samlingen Orders en egenskap för Customer objektet.

Order currentOrder = new Order();
currentCustomer.Orders.Add(currentOrder);

Ta bort objekt från en samling

Du tar bort objekt från en samling genom att anropa Remove metoden eller RemoveAt för din anpassade samlingsklass eller BindingSource.

Anmärkning

Metoderna Remove och RemoveAt tillhandahålls automatiskt för din anpassade samling när du ärver från BindingList<T>.

Följande kod visar hur du hittar och tar bort objekt från den typerade samlingen i en BindingSource med RemoveAt -metoden:

int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);

Visa objektdata för användare

Om du vill visa data i objekt för användare skapar du en objektdatakälla med hjälp av guiden Konfiguration av datakälla och drar sedan hela objektet eller enskilda egenskaper till formuläret från fönstret Datakällor .

Ändra data i objekt

Om du vill redigera data i anpassade objekt som är databundna till Windows Forms-kontroller redigerar du bara data i den bundna kontrollen (eller direkt i objektets egenskaper). Databindningsarkitekturen uppdaterar data i objektet.

Om programmet kräver spårning av ändringar och återställning av föreslagna ändringar till sina ursprungliga värden måste du implementera den här funktionen i objektmodellen. Exempel på hur datatabeller håller reda på föreslagna ändringar finns i DataRowState, HasChangesoch GetChanges.

Spara data i objekt tillbaka till databasen

Spara data tillbaka till databasen genom att skicka värdena från objektet till TableAdapters DBDirect-metoder.

Visual Studio skapar DBDirect-metoder som kan köras direkt mot databasen. Dessa metoder kräver inte DataSet- eller DataTable-objekt.

TableAdapter DBDirect-metod Beskrivning
TableAdapter.Insert Lägger till nya poster i en databas så att du kan skicka in enskilda kolumnvärden som metodparametrar.
TableAdapter.Update Uppdaterar befintliga poster i en databas. Metoden Update tar ursprungliga och nya kolumnvärden som metodparametrar. De ursprungliga värdena används för att hitta den ursprungliga posten och de nya värdena används för att uppdatera posten.

Metoden TableAdapter.Update används också för att stämma av ändringar i en datauppsättning tillbaka till databasen genom att ta en DataSet, DataTable, DataRoweller matris med DataRows som metodparametrar.
TableAdapter.Delete Tar bort befintliga poster från databasen baserat på de ursprungliga kolumnvärden som skickades som metodparametrar.

Om du vill spara data från en samling objekt går du igenom samlingen med objekt (till exempel med hjälp av en for-next-loop). Skicka värdena för varje objekt till databasen med hjälp av TableAdapter DBDirect-metoderna.

I följande exempel visas hur du använder TableAdapter.Insert METODEN DBDirect för att lägga till en ny kund direkt i databasen:

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);
}