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


Привязка объектов в качестве источников данных в приложениях .NET Framework с помощью Visual Studio

Замечание

Классы DataSet и связанные классы являются устаревшими технологиями .NET Framework с начала 2000-х годов, которые позволяют приложениям работать с данными в памяти, пока приложения отключены от базы данных. Технологии особенно полезны для приложений, которые позволяют пользователям изменять данные и сохранять изменения обратно в базу данных. Хотя наборы данных являются проверенными успешными технологиями, рекомендуемый подход для новых приложений .NET заключается в использовании Entity Framework Core. Entity Framework предоставляет более естественный способ работы с табличными данными в виде объектных моделей и имеет более простой интерфейс программирования.

Visual Studio предоставляет средства разработки для работы с пользовательскими объектами в качестве источника данных в приложении. Если вы хотите хранить данные из базы данных в объекте, привязанном к элементам управления пользовательским интерфейсом, рекомендуется использовать Entity Framework для создания класса или классов. Entity Framework автоматически создает весь код отслеживания изменений, что означает, что любые изменения локальных объектов автоматически сохраняются в базе данных при вызове AcceptChanges в объекте DbSet. Дополнительные сведения см. в документации Entity Framework.

Подсказка

Подходы к привязке объектов в этой статье следует учитывать только в том случае, если приложение уже основано на наборах данных. Вы также можете использовать эти подходы, если вы уже знакомы с наборами данных, и данные, которые вы будете обрабатывать, табличны и не слишком сложные или слишком большие. Еще более простой пример, который включает загрузку данных непосредственно в объекты с помощью DataReader и ручного обновления пользовательского интерфейса без привязки данных, см. в статье "Создание простого приложения данных с помощью ADO.NET".

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Замечание

Visual Studio называет запросы Fill TableAdapter и GetData по умолчанию, но эти имена можно изменить на любое допустимое имя метода.

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

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: System.ComponentModel.BindingList<Order>
{
    // Add any additional functionality required by your collection.
}

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

Объекты добавляются в коллекцию путем вызова Add метода пользовательского класса коллекции или объекта BindingSource.

Замечание

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

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

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

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

Замечание

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

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

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

Вы удаляете объекты из коллекции, вызывая метод Remove или RemoveAt вашего пользовательского класса коллекции или BindingSource.

Замечание

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

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

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

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

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

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

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

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

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

Сохраните данные обратно в базу данных, передав значения из вашего объекта в методы TableAdapter DBDirect.

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

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

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

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

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

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