如何:将对象绑定到 Windows 窗体控件(实体框架)
使用实体框架 可以将 Windows 窗体控件(如 ComboBox 或 DataGridView)绑定到 EntityCollection 或 ObjectQuery 结果。 我们建议您不要将控件直接绑定到 ObjectQuery, 而应将控件绑定到 Execute 方法的结果。 有关更多信息,请参见将对象绑定到控件(实体框架)。
本主题中的示例基于 Adventure Works 销售模型。 若要运行本示例中的代码,必须已将 AdventureWorks 销售模型添加到您的项目中,并将项目配置为使用实体框架。 为此,请完成如何:手动配置实体框架项目和如何:手动定义模型和映射文件(实体框架) 中的过程。
示例
以下示例来自 Windows 窗体。 在加载窗体时,会通过调用 ObjectQuery 的 Execute 方法来返回 SalesOrderHeader 对象的 ObjectResult。 此结果被绑定到一个组合框。 在选择某个订单时,SalesOrderDetail 对象的相关 EntityCollection 会绑定到 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();
}
}
}
}
另请参见
任务
如何:将对象绑定到 Windows Presentation Foundation 控件(实体框架)
如何:将对象作为项目数据源添加(实体框架)