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


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

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

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

Примеры

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

Imports System
Imports System.Collections.Generic
Imports System.Collections
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Imports AdventureWorksModel

Public Class Main
    Public Sub New()
        ' Initializes the designer-generated controls.
        InitializeComponent()
    End Sub
    Private context As AdventureWorksEntities
    Private customerId As Integer = 277
    Private Sub Main_Load(ByVal sender As System.Object, _
                           ByVal e As System.EventArgs) _
                           Handles MyBase.Load
        ' Initialize the object context.
        context = New AdventureWorksEntities()
        Try
            ' Create a query for orders that includes line items.
            Dim orderQuery As ObjectQuery(Of SalesOrderHeader) = _
            context.SalesOrderHeader _
                    .Where("it.CustomerID = @customerId", _
                    New ObjectParameter("customerId", customerId)) _
            .Include("SalesOrderDetail")

            ' Bind the combo box to the ObjectResult of SalesOrderHeader 
            ' that is returned when the query is executed.
            Me.ordersListBox.DataSource = orderQuery.Execute(MergeOption.AppendOnly)

            ' Display the PO number in the combo box.
            Me.ordersListBox.DisplayMember = "PurchaseOrderNumber"

        Catch ex As EntitySqlException
            MessageBox.Show(ex.Message)
        End Try
    End Sub
    Private Sub ordersListBox_SelectedIndexChanged(ByVal sender As System.Object, _
                                                    ByVal e As System.EventArgs) _
                                                    Handles ordersListBox.SelectedIndexChanged
        ' Get the currently selected SalesOrderHeader object.
        Dim order As SalesOrderHeader = CType(Me.ordersListBox.SelectedItem,  _
        SalesOrderHeader)

        ' Bind the items for this order to the DataGridView.
        lineItemsDataGrid.DataSource = order.SalesOrderDetail
    End Sub

    Private Sub saveButton_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles saveButton.Click
        ' Get the current order. 
        Dim order As SalesOrderHeader = CType(ordersListBox.SelectedItem,  _
            SalesOrderHeader)

        Try
            ' Save changes in the object context.
            context.SaveChanges(True)

        Catch ex As OptimisticConcurrencyException
            ' Resolve the concurrently conflict by refreshing the 
            ' object context before saving changes. 
            context.Refresh(RefreshMode.ClientWins, order.SalesOrderDetail)

            ' Resave changes in the object context.
            context.SaveChanges(True)
        Catch ex As Exception
            MessageBox.Show(ex.InnerException.Message, "An error has occured")
        Finally
            ' Refresh the latest data from the database.
            context.Refresh(RefreshMode.StoreWins, order)
            Me.Refresh()
        End Try
    End Sub
End Class
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;
using AdventureWorksModel;

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.SalesOrderHeader
                    .Where("it.CustomerID = @customerId", 
                    new ObjectParameter("customerId", customerId))
                    .Include("SalesOrderDetail");

                // Bind the combo box to the ObjectResult of SalesOrderHeader 
                // that is returned when the query is executed.
                this.ordersListBox.DataSource = orderQuery.Execute(MergeOption.AppendOnly);

                // Display the PO number in the combo box.
                this.ordersListBox.DisplayMember = "PurchaseOrderNumber";
            }
            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.SalesOrderDetail;
        }

        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(true);
            }
            catch (OptimisticConcurrencyException)
            {
                // Resolve the concurrently conflict by refreshing the 
                // object context before saving changes. 
                context.Refresh(RefreshMode.ClientWins, order.SalesOrderDetail);

                // Resave changes in the object context.
                context.SaveChanges(true);
            }
            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)
Привязка данных сущностей к элементам управления (сценарии приложений)