Поделиться через


Как привязать элементы управления к производным типам (платформа Entity Framework)

Службы Entity Framework позволяют привязать элементы управления Windows Forms, такие, как ComboBox или DataGridView, к элементу EntityCollection. Однако, если метод OfType выполняется для коллекции EntityCollection с целью возврата коллекции объектов производного типа, возвращаемый объект IEnumerable нельзя напрямую привязать к элементу управления. В следующем примере демонстрируется использование метода CreateSourceQuery для создания атрибута ObjectQuery, определяющего элемент EntityCollection. Запрос выполняется с методом OfType для выполнения привязки к определенному подтипу. Дополнительные сведения см. в разделе Привязка объектов к элементам управления (платформа Entity Framework).

Пример в этом разделе основан на измененной версии модели School. Эта версия поддерживает наследование типа «одна таблица на тип», причем Course является абстрактным типом. Выполните пошаговое руководство Наследование сопоставления «одна таблица на тип» чтобы внести изменения в модель School для реализации примера наследования типа «одна таблица на тип», показанного в данном разделе.

Пример

Следующий пример заимствован из элемента управления Windows Form. При загрузке формы происходит возврат экземпляра ObjectResult объекта Department путем вызова метода Execute объекта ObjectQuery. Этот результат привязан к полю со списком. При выборе заказа метод CreateSourceQuery вызывается для связанных элементов EntityCollection объектов Course. Возвращаемый запрос ObjectQuery выполняется с использованием метода OfType, а результат привязывается к элементу управления DataGridView. Тип, используемый с методом OfType, является набором, основанным на переключателе в форме.

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();
        }
    }
}

См. также

Задачи

Как привязать объекты к элементам управления WPF (платформа Entity Framework)
Как привязать объекты к элементам управления Windows Form (платформа Entity Framework)

Основные понятия

Привязка объектов к элементам управления (платформа Entity Framework)