如何:将对象绑定到 Windows 窗体控件(实体框架)

使用对象服务可以将 Windows 窗体控件(如 ComboBoxDataGridView)绑定到 EntityCollectionObjectQuery 结果。我们建议您不要将控件直接绑定到 ObjectQuery,而应将控件绑定到 Execute 方法的结果。有关更多信息,请参见将对象绑定到控件(实体框架)

本主题中的示例基于 Adventure Works 销售模型。若要运行本示例中的代码,必须已将 AdventureWorks 销售模型添加到您的项目中,并将项目配置为使用实体框架。为此,请完成如何:手动配置实体框架项目如何:手动定义实体数据模型(实体框架) 中的过程。

示例

以下示例来自 Windows 窗体。在加载窗体时,会通过调用 ObjectQueryExecute 方法来返回 SalesOrderHeader 对象的 ObjectResult。此结果被绑定到一个组合框。在选择某个订单时,SalesOrderDetail 对象的相关 EntityCollection 会绑定到 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();
            }
        }
    }
}

另请参见

任务

如何:将对象绑定到 Windows Presentation Foundation 控件(实体框架)
如何:添加对象作为项目数据源(实体框架)

概念

将对象绑定到控件(实体框架)
将实体数据绑定到控件(应用程序方案)