Sdílet prostřednictvím


Svázat objekty v sadě Visual Studio

 

Publikováno: srpen 2016

Visual Studio poskytuje návrhových nástrojů pro práci s vlastní objekty (na rozdíl od jiných zdrojů dat například entit, datové sady a služby) jako zdroj dat v aplikaci. Chcete uložit data z databáze v objektu, který Svázání ovládacích prvků uživatelského rozhraní, doporučený postup při použití Entity Framework ke generování třídy nebo tříd. EF bude automaticky vytvořit všechny standardní sledování změn kódu, což znamená, že všechny změny místní objekty budou automaticky natrvalo do databáze při volání metoda AcceptChanges u DbSet objektu. Další informace naleznete v tématu Entity Framework dokumentace.

Tip

Přístupy k objektu vazby v tomto článku je třeba zvážit pouze, pokud vaše aplikace je již založena na datové sady nebo pokud jste již obeznámeni s datových sad a data, která bude zpracovávat je tabulkový a příliš složitý nebo příliš velký. Příklad ještě jednodušší načíst data přímo do objektů pomocí DataReader a ruční aktualizace uživatelského rozhraní bez vazby dat naleznete v tématu Vytvoření jednoduché datové aplikace pomocí ADO.NET.

Požadavky na objekt

Jediný požadavek pro vlastní objekty pro práci s daty návrhových nástrojů v sadě Visual Studio je, že objekt potřebuje alespoň jednu veřejnou vlastnost.

Obecně platí vlastní objekty nevyžadují žádná zvláštní rozhraní konstruktory nebo atributy, aby se choval jako zdroj dat pro aplikaci. Však pokud chcete přetáhněte objekt z zdroje dat okna na návrhovou plochu lze vytvořit ovládací prvek vázaný na data a v případě, že daný objekt implementuje ITypedList nebo IListSource rozhraní, tento objekt musí mít výchozí konstruktor. Jinak aplikace Visual Studio nelze vytvořit instanci objektu zdroje dat a zobrazí chybu, pokud přetáhnete položku na návrhovou plochu.

Příklady použití vlastních objektů jako zdroje dat

Přestože jsou některé způsoby, jak implementovat aplikační logiku při práci s objekty jako zdroj dat, pro SQL databáze existuje jsou několik standardní operace, které může být zjednodušeno pomocí sady Visual Studio – generované třídy TableAdapter objektů. Tato stránka vysvětluje, jak implementovat tyto standardní procesy pomocí objekty TableAdapter; není určen jako vodítko k vytvoření vlastních objektů. Budete například obvykle provádět následující standardní operace bez ohledu na konkrétní implementaci objekty nebo logiku aplikace:

  • Načítání dat do objektů (obvykle z databáze).

  • Vytváření typované kolekce objektů.

  • Objekty pro přidávání a odebírání objekty z kolekce.

  • Zobrazení dat objektu pro uživatele ve formuláři.

  • Změna a úpravy dat v objektu.

  • Ukládání dat z objektů zpět do databáze.

Poznámka

Aby bylo možné lépe pochopit a poskytují kontext příklady na této stránce, doporučujeme provést následující: Návod: Připojování k datům v objektech (Windows Forms). Tento návod vytvoří objekty popsané na této stránce nápovědy.

Načítání dat do objektů

V tomto příkladu načtení dat do objekty pomocí objekty TableAdapter. Ve výchozím nastavení jsou objekty TableAdapter vytvořeny s dva druhy metod, které načítat data z databáze a naplnit datových tabulek.

  • TableAdapter.Fill Metoda vyplní daty vrácenými existující data tabulky.

  • TableAdapter.GetData Metoda vrátí novou tabulku dat naplněn daty.

Nejjednodušší způsob, jak načíst vaše vlastní objekty s daty je volání TableAdapter.GetData Metoda, procházení kolekce řádků v tabulce vrácená data a naplnit každý objekt s hodnotami v každém řádku. Můžete vytvořit GetData metodu, která vrací tabulku naplněn dat pro dotazy přidané do objektu TableAdapter.

Poznámka

Visual Studio názvy dotazů TableAdapter Fill a GetData ve výchozím nastavení, ale tyto názvy lze změnit na libovolný platný název metody.

Následující příklad ukazuje, jak Iterujte přes řádky v tabulce dat a naplnit objekt s daty:

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

Vytváření typované kolekce objektů

Můžete vytvořit kolekce tříd pro objekty nebo použít typované kolekce, které jsou automaticky poskytované BindingSource – komponenta.

Při vytváření třídy vlastní kolekce pro objekty, doporučujeme je zděděn z BindingList<T>. Tato obecná třída poskytuje funkce pro správu vaše kolekce, jakož i schopnost vyvolat události, které odesílání oznámení do infrastruktury datové vazby ve Windows Forms.

Kolekce automaticky generovány v BindingSource používá BindingList<T> pro jeho typované kolekce. Pokud vaše aplikace nevyžaduje další funkce, pak budete moci udržovat vaše kolekce v rámci BindingSource. Další informace naleznete v tématu List vlastnost BindingSource třídy.

Poznámka

Pokud vaše kolekce bude vyžadovat funkce nejsou poskytovány společností základní implementace BindingList<T>, pak je třeba vytvořit vlastní kolekce, takže lze přidat do třídy podle potřeby.

Následující kód ukazuje, jak vytvořit třídu pro silně typované kolekce Order objekty:

    /// <summary>
    /// A collection of Orders
    /// </summary>
    public class Orders: System.ComponentModel.BindingList<Order>
    {
        // Add any additional functionality required by your collection.
    }
    ''' <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

Přidání objektů do kolekce

Přidat objekty do kolekce voláním Add Metoda vaší třídy vlastní kolekce nebo BindingSource.

Příklad pro přidání do kolekce pomocí BindingSource, naleznete v části LoadCustomers Metoda v Návod: Připojování k datům v objektech (Windows Forms).

Příklad přidání objektů do vlastní kolekce, naleznete v tématu LoadOrders Metoda v Návod: Připojování k datům v objektech (Windows Forms).

Poznámka

Add Metoda je automaticky k dispozici pro vlastní shromažďování při dědění ze BindingList<T>.

Následující kód ukazuje, jak můžete přidat objekty do typované kolekce v BindingSource:

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

Následující kód ukazuje, jak můžete přidat objekty do typovou kolekci, která dědí z BindingList<T>:

Poznámka

V tomto příkladu Orders kolekce je vlastnost Customer objektu.

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

Odebírání objektů z kolekce

Odstranění objektů z kolekce voláním Remove nebo RemoveAt Metoda vaší třídy vlastní kolekce nebo BindingSource.

Poznámka

Remove a RemoveAt metody jsou automaticky poskytované pro vlastní shromažďování při dědění ze BindingList<T>.

Následující kód ukazuje, jak vyhledat a odebrat objekty z typované kolekce v BindingSource s RemoveAt Metoda:

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

Zobrazení dat objektu pro uživatele

Chcete-li zobrazit data v objektech uživatelům, vytvoříte zdroj dat objektu pomocí Průvodce konfigurací zdroje dat, a poté přetáhněte celý objekt nebo jednotlivé vlastnosti do svého formuláře z zdroje dat okna.

Úprava dat v objektech

Chcete-li upravit data ve vlastních objektů, které jsou vázané na data pro ovládací prvky Windows Forms, jednoduše připojeného ovládacího prvku (nebo přímo do vlastností objektu) data upravte. Architektura vazby dat bude aktualizovat data v objektu.

Pokud aplikace vyžaduje sledování změn a Hromadná zadní navrhované změny na původní hodnoty, musíte tuto funkci implementovat v objektovém modelu. Příklady jak tabulek dat udržování přehledu o navrhované změny, naleznete v tématu DataRowState, HasChanges, a GetChanges.

Uložení dat do objektů zpět do databáze

Uložit data zpět do databáze předáním hodnoty z objektu TableAdapter DBDirect – metody.

Visual Studio vytvoří DBDirect metody, které mohou být provedeny přímo v databázi. Tyto metody nevyžadují DataSet nebo DataTable objekty.

TableAdapter DBDirect – metoda Popis
TableAdapter.Insert Přidá nových záznamů do databáze, což vám umožní předávat hodnoty jednotlivých sloupců jako parametry metody.
TableAdapter.Update Aktualizace existujících záznamů v databázi. Metoda aktualizace přebírá původní a nový sloupec hodnoty jako parametry metody. Původní hodnoty slouží k vyhledání původní záznam a nové hodnoty slouží k aktualizaci záznamů.

 TableAdapter.Update Metoda slouží také sloučit změny v datové sadě zpět do databáze tím, že DataSet, DataTable, DataRow, nebo pole DataRows jako parametry metody.
TableAdapter.Delete Odstraní existující záznamy z databáze založené na původní hodnoty sloupce předána jako parametry metody.

Uložení dat z kolekce objektů, projděte kolekci objektů (například pomocí pro další smyčky) a odeslat hodnoty pro každý objekt k databázi pomocí TableAdapter DBDirect – metody.

Následující příklad ukazuje způsob použití TableAdapter.Insert DBDirect metodu pro přidání nového zákazníka přímo do databáze:

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

Viz také

Vytvoření vazby ovládacích prvků k datům v sadě Visual Studio