Procédure : lier des contrôles à des types dérivés (Entity Framework)
Entity Framework permet de lier des contrôles Windows Form (p.ex., ComboBox ou DataGridView) à un objet EntityCollection. Toutefois, lorsque vous exécutez la méthode OfType sur un objet EntityCollection pour retourner une collection d'objets d'un type dérivé, vous ne pouvez pas lier l'objet IEnumerable retourné directement à un contrôle. L'exemple de cette rubrique montre comment utiliser la méthode CreateSourceQuery pour créer une classe ObjectQuery qui définit l'objet EntityCollection. Cette requête est exécutée avec la méthode OfType pour effectuer la liaison à un sous-type spécifique. Pour plus d'informations, consultez la rubrique Liaison d'objets à des contrôles (Entity Framework).
L'exemple fourni dans cette rubrique est basé sur une version modifiée du modèle School. Cette version prend en charge l'héritage table par type avec Course comme type abstrait. Effectuez la procédure Mappage de l'héritage - TPT (table par type) pour modifier le modèle School afin de prendre en charge l'exemple d'héritage table par type utilisé dans cette rubrique.
Exemple
L'exemple suivant est issu d'un formulaire Windows Forms. Lorsque le formulaire est chargé, un objet ObjectResult d'objets Department est retourné en appelant la méthode Execute de la classe ObjectQuery. Ce résultat est lié à une zone de liste déroulante. Lorsqu'une commande est sélectionnée, la méthode CreateSourceQuery est appelée sur l'objet EntityCollection des objets Course. La classe ObjectQuery retournée a été exécutée à l'aide de la méthode OfType et le résultat est lié à un contrôle DataGridView. Le type utilisé avec la méthode OfType est défini selon un paramètre de case d'option dans le formulaire.
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 SchoolForm : Form
{
private SchoolEntities context;
private bool isOnlineCourse = false;
public SchoolForm()
{
// Initializes the designer-generated controls.
InitializeComponent();
if (isOnlineCourse) radioButtonOnline.Checked = true;
else radioButtonOnsite.Checked = true;
}
private void SchoolForm_Load(object sender, EventArgs e)
{
// Initialize the object context.
try
{
context = new SchoolEntities();
// Create a query for all departments.
ObjectQuery<Department> departmentQuery =
context.Departments;
// Display the department name in the combo box.
this.comboBoxDepartment.DisplayMember = "Name";
// Bind the combo box to the ObjectResult of the departments
// that are returned when the query is executed.
this.comboBoxDepartment.DataSource =
departmentQuery.Execute(MergeOption.AppendOnly);
}
catch (EntitySqlException ex)
{
MessageBox.Show(ex.Message);
}
}
private void BindToCourseByType()
{
// Get the currently selected Department object.
Department selectedDepartment =
(Department)this.comboBoxDepartment.SelectedItem;
try
{
if (isOnlineCourse)
{
// Bind the data grid to the result of the execution of the ObjectQuery
// that returns only the online courses for the selected department.
dataGridViewCourses.DataSource =
selectedDepartment.Courses.CreateSourceQuery()
.OfType<OnlineCourse>().Execute(MergeOption.AppendOnly);
}
else
{
// Bind the data grid to the result of the execution of the ObjectQuery
// that returns only the on-site courses for the selected department.
dataGridViewCourses.DataSource =
selectedDepartment.Courses.CreateSourceQuery()
.OfType<OnsiteCourse>().Execute(MergeOption.AppendOnly);
}
// Hide the columns bound to navigation properties.
dataGridViewCourses.Columns["Department"].Visible = false;
dataGridViewCourses.Columns["StudentGrades"].Visible = false;
dataGridViewCourses.Columns["People"].Visible = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void departmentComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
this.BindToCourseByType();
}
private void onlineRadio_CheckedChanged(object sender, EventArgs e)
{
if (this.radioButtonOnline.Checked)
{
isOnlineCourse = true;
this.BindToCourseByType();
}
else
{
isOnlineCourse = false;
this.BindToCourseByType();
}
}
private void Close_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
Voir aussi
Tâches
Procédure : lier des objets à des contrôles Windows Presentation Foundation (Entity Framework)
Procédure : lier des objets à des contrôles Windows Form (Entity Framework)