Привязка объектов в Visual Studio

 

Опубликовано: Апрель 2016

Visual Studio предоставляет средства разработки для работы с пользовательскими объектами (в отличие от других источников данных, например сущностей, наборов данных и служб) в качестве источников данных в приложении.

Требования к объектам

Единственное требование для пользовательских объектов для работы с средствами разработки данных в Visual Studio – то, что объекту требуется по крайней мере одно общее свойство.

В целом пользовательские объекты не нуждаются в определенных интерфейсах, конструкторах или атрибутах, чтобы служить источником данных для приложения. Однако если необходимо перетащить объект из окна Источники данных в рабочую область конструирования для создания элемента управления, связанного с данными, и если этот объект реализует интерфейс ITypedList или IListSource, то он должен иметь конструктор по умолчанию (то есть конструктор без параметров). В противном случае Visual Studio не сможет создать экземпляр объекта источника данных и отобразит ошибку при перетаскивании элемента в рабочую область конструирования.

Примеры использования пользовательских объектов в качестве источников данных

Хотя есть множество способов реализовать логику приложения при работе с объектами в качестве источников данных, существует несколько стандартных операций, которые можно упростить с помощью создаваемых Visual Studio объектов TableAdapter. На этой странице обсуждаются способы реализации этих стандартных процессов с помощью объектов адаптеров таблиц; страница не является руководством для создания пользовательских объектов. Например, вы можете выполнять следующие стандартные операции независимо от конкретной реализации объектов или логики приложения:

  • Загрузка данных в объекты (обычно из базы данных).

  • Создание типизированных коллекций объектов.

  • Добавление объектов в коллекцию и их удаление.

  • Отображение данных объектов для пользователей на форме.

  • Изменение/редактирование данных в объекте.

  • Сохранение данных из объектов обратно в базу данных.

Примечание

Чтобы лучше понять и предоставить контекст для примеров на этой странице, рекомендуется выполнить следующее: Пошаговое руководство. Подключение к данным в объектах (Windows Forms). В данном пошаговом руководстве создаются объекты, обсуждаемые на этой странице справки.

Загрузка данных в объекты

В этом пошаговом руководстве происходит загрузка данных в объекты с помощью адаптера таблиц. По умолчанию адаптеры таблиц создаются с двумя видами методов: методом выборки данных из базы данных и методом заполнения таблиц данных.

  • Метод TableAdapter.Fill позволяет заполнять существующие таблицы данных возвращаемыми данными.

  • Метод TableAdapter.GetData позволяет возвращать новую таблицу данных, заполненную данными.

Наиболее простой метод загрузки данных в объект — вызов метода TableAdapter.GetData, цикл по коллекции строк в таблице возвращаемых данных и заполнение каждого объекта значениями каждой строки. Можно создать метод GetData, возвращающий заполненные таблицы данных для любого запроса, добавленного в адаптер таблиц.

Примечание

По умолчанию Visual Studio именует запросы адаптера таблиц Fill и GetData, однако эти имена могут быть изменены.

В следующем пошаговом руководстве демонстрируется цикл по строкам в таблице данных и заполнение объекта данными:

Более полный пример кода содержится в разделе Пошаговое руководство. Подключение к данным в объектах (Windows Forms).

        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

Создание типизированных коллекций объектов

Можно создать классы коллекций для объектов или использовать типизированные коллекции, автоматически предоставляемые Компонент BindingSource.

При создании пользовательского класса коллекции объектов рекомендуется наследование из BindingList<T>. Этот универсальный класс предоставляет функциональные возможности для администрирования коллекции, а также возможность вызывать события, отправлять уведомления в инфраструктуру привязки данных в формах Windows Forms.

Автоматически созданная коллекция в BindingSource использует BindingList<T> для своей типизированной коллекции. Если приложение не требует дополнительных функциональных возможностей, можно поддерживать в коллекцию в BindingSource. Для получения дополнительных сведений см. свойство List класса BindingSource.

Примечание

Если ваша коллекция потребует функциональных возможностей, не поддерживаемых базовой реализацией BindingList<T>, следует создать пользовательскую коллекцию, которую можно будет добавить в класс при необходимости.

В следующем коде показано, как создать класс строго типизированной коллекции объектов Order:

    /// <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

Добавление элементов в коллекцию

Добавить объекты в коллекцию можно, вызвав метод Add класса пользовательской коллекции или BindingSource.

В качестве примера добавления в коллекцию с помощью BindingSource рассмотрите метод LoadCustomers в Пошаговое руководство. Подключение к данным в объектах (Windows Forms).

В качестве примера добавления объектов в пользовательскую коллекцию рассмотрите метод LoadOrders в Пошаговое руководство. Подключение к данным в объектах (Windows Forms).

Примечание

Метод Add автоматически предоставляется для пользовательской коллекции при наследовании от BindingList<T>.

В следующем коде показано, как добавлять объекты в типизированную коллекцию в BindingSource:

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

В следующем коде показано, как добавлять объекты в типизированную коллекцию, наследуемую от BindingList<T>:

Примечание

В этом пошаговом руководстве коллекция Orders является свойством объекта Customer.

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

Удаление объектов из коллекции

Удалить объекты из коллекции можно, вызвав метод Remove или метод RemoveAt класса пользовательской коллекции или BindingSource.

Примечание

Методы Remove и RemoveAt автоматически предоставляются для пользовательской коллекции при наследовании от BindingList<T>.

Следующий фрагмент кода иллюстрирует поиск и удаление объектов из типизированной коллекции в BindingSource с помощью метода RemoveAt:

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

Отображение данных объектов для пользователей

Для отображения данных объектов для пользователей создайте источник данных объекта с помощью мастера мастер настройки источника данных, а затем перетащите весь объект или отдельные свойства на форму из окна Источники данных.

Дополнительные сведения о создании источников данных на основе объектов, см. в разделе Практическое руководство. Подключение к данным в объектах.

Дополнительные сведения по отображению данных из объектов в формах Windows Forms содержатся в разделе Привязка элементов управления к данным в Visual Studio.

Изменение данных в объектах

Чтобы изменить данные в пользовательских объектах, которые привязаны к элементам управления Windows Forms, просто измените данные в связанном элементе управления (или прямо в свойствах объекта). Архитектура связывания данных обновит данные в объекте.

Если приложение требует отслеживания изменений и отката произошедших изменений, необходимо реализовать эту функциональную возможность в модели объекта. Примерами слежения таблиц данных за произошедшими изменениями могут служить DataRowState HasChanges и GetChanges.

Сохранение данных из объектов в базе данных

Данные сохраняются в базе данных путем передачи значений из объектов в методы DBDirect адаптера таблиц.

Visual Studio создает методы DBDirect, которые могут выполняться прямо в базе данных. Эти методы не требуют объектов DataSet или DataTable.

Метод DBDirect адаптера таблиц Описание
TableAdapter.Insert Добавляет новые записи в базу данных, позволяя передать отдельные значения столбцов в качестве параметров метода.
TableAdapter.Update Обновляет в базе данных существующие записи. Метод Update принимает исходные и новые значения столбцов в качестве параметров метода. Исходные значения используются для обнаружения исходной записи, а новые значения используются для обновления этой записи.

Метод TableAdapter.Update также используется для согласования изменений в наборе данных с базой данных путем принятия в качестве параметров метода DataSet, DataTable, DataRow или массива DataRow.
TableAdapter.Delete Удаляет существующие записи из базы данных на основе исходных значений столбца, переданных как параметры метода.

Чтобы сохранить данные из коллекции объектов, просмотрите всю коллекцию объектов (например, циклом for-next) и отправьте значения каждого объекта в базу данных с помощью методов DBDirect адаптера таблиц.

В следующем пошаговом руководстве показано использование DBDirect метода TableAdapter.Insert для добавления нового клиента прямо в базу данных:

        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

См. также

Практическое руководство. Подключение к данным в объектах
Пошаговое руководство. Подключение к данным в объектах (Windows Forms)
Практическое руководство. Сохранение данных из объекта в базе данных
Практическое руководство. Непосредственный доступ к базе данных с помощью адаптера таблицы
Пошаговое руководство. Сохранение данных с помощью методов DBDirect адаптера таблицы
Привязка элементов управления к данным в Visual Studio
адаптеры таблиц TableAdapter
Сохранение данных