How to: Bind Objects to Windows Form Controls

The Entity Framework enables you to bind Windows Form controls such as a ComboBox or DataGridView to an EntityCollection or to an ObjectQuery result. We recommend that you not bind controls directly to an ObjectQuery. Instead, bind controls to the result of the Execute method. For more information, see Binding Objects to Controls.

The example in this topic is based on the Adventure Works Sales Model. To run the code in this example, you must have already added the AdventureWorks Sales Model to your project and configured your project to use the Entity Framework. To do this, complete the procedures in How to: Manually Configure an Entity Framework Project and How to: Manually Define the Model and Mapping Files.


The following example is from a Windows Form. When the form is loaded, an ObjectResult of SalesOrderHeader objects is returned by calling the Execute method of the ObjectQuery. This result is bound to a combo box. When an order is selected, the related EntityCollection of SalesOrderDetail objects is bound to a DataGridView control.

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.
        private void Main_Load(object sender, EventArgs e)
            // Initialize the object context.
            context = new AdventureWorksEntities();
                // Create a query for orders that includes line items.
                ObjectQuery<SalesOrderHeader> orderQuery = context.SalesOrderHeaders
                    .Where("it.CustomerID = @customerId", 
                    new ObjectParameter("customerId", customerId))

                // 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)

        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;

                // Save changes in the object context.
            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.
            catch (Exception ex)
                MessageBox.Show(ex.InnerException.Message, "An error has occured");
                //  Refresh the latest data from the database.
                context.Refresh(RefreshMode.StoreWins, order);

See Also

Was this page helpful?
(1500 characters remaining)
Thank you for your feedback

Community Additions

© 2015 Microsoft