Привязка объектов в 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