Gewusst wie: Binden von Steuerelementen an abgeleitete Typen (Entity Framework)

Mit Entity Framework können Sie Windows Forms-Steuerelemente wie z. B. ComboBox oder DataGridView, an eine EntityCollection-Auflistung binden. Wenn Sie jedoch die OfType-Methode auf ein EntityCollection anwenden, um eine Auflistung der Objekte eines abgeleiteten Typs zurückzugeben, können Sie den zurückgegebenen IEnumerable nicht direkt an ein Steuerelement binden. Im folgenden Beispiel wird veranschaulicht, wie Sie mit der CreateSourceQuery-Methode eine ObjectQuery erstellen, durch die die EntityCollection definiert wird. Diese Abfrage wird mit der OfType-Methode ausgeführt, um die Bindung an einen bestimmten Untertyp auszuführen. Weitere Informationen finden Sie unter Binden von Objekten an Steuerelemente (Entity Framework).

Das Beispiel in diesem Thema basiert auf einer geänderten Version des Modells "School". Diese Version unterstützt "Tabelle pro Typ"-Vererbung mit Course als abstrakten Typ. Schließen Sie die exemplarische Vorgehensweise zur Zuordnungsvererbung "Tabelle pro Typ" ab, um das Modell "School" so zu ändern, dass das in diesem Thema verwendete "Tabelle pro Typ"-Vererbungsbeispiel unterstützt wird.

Beispiel

Das folgende Beispiel stammt von Windows Form. Beim Laden des Formulars wird ein ObjectResult von Department-Objekten durch Aufruf der Execute-Methode der ObjectQuery zurückgegeben. Dieses Ergebnis wird an ein Kombinationsfeld gebunden. Beim Auswählen einer Reihenfolge wird die CreateSourceQuery-Methode für die verwandte EntityCollection der Course-Objekte aufgerufen. Die zurückgegebene mit der OfType-Methode durchgeführte ObjectQuery und das Ergebnis werden an ein DataGridView-Steuerelement gebunden. Der Typ, der für die OfType-Methode verwendet wird, wird auf Grundlage einer Optionsfeldeinstellung im Formular festgelegt.

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

Siehe auch

Aufgaben

Gewusst wie: Binden von Objekten an Windows Presentation Foundation-Steuerelemente (Entity Framework)
Gewusst wie: Binden von Objekten an Windows Form-Steuerelemente (Entity Framework)

Konzepte

Binden von Objekten an Steuerelemente (Entity Framework)