Как привязать объекты к элементам управления Windows Form (платформа Entity Framework)

Entity Framework позволяет выполнить привязку элементов управления Windows Form (например, ComboBox или DataGridView) к EntityCollection или ObjectQuery. Не рекомендуется привязывать элементы управления непосредственно к ObjectQuery. Вместо этого лучше привязывать элементы управления к результату метода Execute. Дополнительные сведения см. в разделе Привязка объектов к элементам управления (платформа Entity Framework).

Пример в этом разделе основан на модели Adventure Works Sales. Чтобы запустить код из данного примера, нужно сначала добавить к проекту модель AdventureWorks Sales и настроить его для использования платформы Entity Framework. Для этого выполните инструкции из разделов Как вручную настроить проект Entity Framework и Как определить модель и файлы сопоставления вручную (платформа Entity Framework).

Пример

Следующий пример заимствован из элемента управления Windows Form. При загрузке формы происходит возврат экземпляра ObjectResult объекта SalesOrderHeader путем вызова метода Execute объекта ObjectQuery. Этот результат привязан к полю со списком. При выборе заказа соответствующая коллекция EntityCollection объектов SalesOrderDetail привязывается к элементу управления DataGridView.

using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

namespace Microsoft.Samples.Edm
{
    public partial class Main : Form
    {
        private AdventureWorksEntities context;
        private int customerId = 277;

        public Main()
        {
            // Initializes the designer-generated controls.
            InitializeComponent();
        }
        
        private void Main_Load(object sender, EventArgs e)
        {
            // Initialize the object context.
            context = new AdventureWorksEntities();
            try
            {
                // Create a query for orders that includes line items.
                ObjectQuery<SalesOrderHeader> orderQuery = context.SalesOrderHeaders
                    .Where("it.CustomerID = @customerId", 
                    new ObjectParameter("customerId", customerId))
                    .Include("SalesOrderDetails");

                // Display the PO number in the combo box.
                this.ordersListBox.DisplayMember = "PurchaseOrderNumber";

                // Bind the combo box to the ObjectResult of SalesOrderHeader 
                // that is returned when the query is executed.
                this.ordersListBox.DataSource = orderQuery.Execute(MergeOption.AppendOnly);
            }
            catch (EntitySqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void ordersListBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Get the currently selected SalesOrderHeader object.
            SalesOrderHeader order = (SalesOrderHeader)this.ordersListBox.SelectedItem;

            // Bind the items for this order to the DataGridView.
            lineItemsDataGrid.DataSource = order.SalesOrderDetails;
        }

        private void saveButton_Click(object sender, EventArgs e)
        {
            // Get the current order.    
            SalesOrderHeader order = (SalesOrderHeader)ordersListBox.SelectedItem;

            try
            {
                // Save changes in the object context.
                context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
            }
            catch (OptimisticConcurrencyException)
            {
                // Resolve the concurrently conflict by refreshing the 
                // object context before saving changes. 
                context.Refresh(RefreshMode.ClientWins, order.SalesOrderDetails);

                // Resave changes in the object context.
                context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.Message, "An error has occured");
            }
            finally
            {
                //  Refresh the latest data from the database.
                context.Refresh(RefreshMode.StoreWins, order);
                this.Refresh();
            }
        }
    }
}

См. также

Задачи

Как привязать объекты к элементам управления WPF (платформа Entity Framework)
Как добавить объект в качестве источника данных проекта (платформа Entity Framework)

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

Привязка объектов к элементам управления (платформа Entity Framework)