Поделиться через


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

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

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

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

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

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

Примечание

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

В следующем коде показано, как создать класс строго типизированной коллекции объектов 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.
}

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

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

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

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

Примечание

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

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

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

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

Примечание

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

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

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

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

Примечание

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

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

Dim customerIndex As Integer = CustomerBindingSource.Find("CustomerID", "ALFKI")
CustomerBindingSource.RemoveAt(customerIndex)
int customerIndex = 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 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);
}

См. также

Задачи

Практическое руководство. Подключение к данным в объектах

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

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

Практическое руководство. Непосредственный доступ к базе данных с помощью адаптера таблицы

Пошаговое руководство. Сохранение данных с помощью методов DBDirect адаптера таблицы

Основные понятия

Привязка элементов управления к данным в Visual Studio

Другие ресурсы

адаптеры таблиц TableAdapter

Сохранение данных