次の方法で共有


オブジェクトを Windows フォーム コントロールにバインドする方法 (Entity Framework)

Object Services を使用すると、EntityCollectionObjectQuery の結果に対して、ComboBoxDataGridView などの Windows フォーム コントロールをバインドできます。コントロールを ObjectQuery に直接バインドしないことをお勧めします。代わりに、コントロールを Execute メソッドの結果にバインドします。詳細については、「コントロールへのオブジェクトのバインド (Entity Framework)」を参照してください。

このトピックの例には、Adventure Works Sales Model が使用されています。この例のコードを実行するには、あらかじめプロジェクトに AdventureWorks Sales Model を追加し、Entity Framework が使用されるようにプロジェクトを構成しておく必要があります。具体的な方法については、「Entity Framework プロジェクトを手動で構成する方法」および「Entity Data Model を手動で定義する方法 (Entity Framework)」の手順を参照してください。

次の例は、Windows フォームからの抜粋です。フォームの読み込み時に、ObjectQueryExecute メソッドを呼び出して、SalesOrderHeader オブジェクトの ObjectResult が返されます。この結果は、コンボ ボックスにバインドされます。注文が選択されると、SalesOrderDetail オブジェクトの関連する EntityCollectionDataGridView コントロールにバインドされます。

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 コントロールにバインドする方法 (Entity Framework)
オブジェクトをプロジェクト データ ソースとして追加する方法 (Entity Framework)

概念

コントロールへのオブジェクトのバインド (Entity Framework)
コントロールへのエンティティ データのバインド (アプリケーション シナリオ)