ADO.NET. Управление базами данных. Связь по схеме OLE DB провайдера. Коррекция стилей DataGridView, страница 45

Справедливо и обратное утверждение, а именно: набор данных (DataSet) может быть сгенерирован по известной схеме. Сейчас мы намерены показать, как это делается в рамках студии.

·  Исключите схему из проекта, выбрав команду Exclude from project.

·  Вновь добавьте файл схемы Student.xsd в проект, выбрав команду контекстного меню Add®Existing Item).

Обратите внимание на то, что в папке Data появился новый файл Students.Designer.cs. Откройте его и убедитесь, что он содержит код класса, производного от DataSet.

    public partial class StudsExams : global::System.Data.DataSet

Этот класс был автоматически сгенерирован студией на основе информации файла со схемой DataSet. Это и есть типизированный DataSet. Просматривать структуру класса удобно с помощью окна Class View, или с помощью компонента Object Browser. Откройте один из этих инструментов с помощью команды, выбранной из меню View, и убедитесь, что новый класс StudsExams обитает в пространстве имен StudentsDBEx.Data и представляет собой довольно сложную структуру данных.

Другой инструмент студии — Class Diagram отображает структуру класса в графическом виде. Вы можете создать диаграмму класса с помощью команды View Class Diagram, выбранной в контекстном меню из окна Class View. На рисунке ниже приведена часть диаграммы, которая показывает классы, вложенные в StudsExams.

 

 

 

Класс StudsExams содержит вложенные описания классов (Nested Types). Они помогают работать с таблицами (классы StudsDataTable и ExamsDataTable) и со строками этих таблиц (классы StudsRow и ExamsRow).

В классе StudsExams также присутствует определение делегатных типов:

public delegate void StudsRowChangeEventHandler(object sender, StudsRowChangeEvent e);

public delegate void ExamsRowChangeEventHandler(object sender, ExamsRowChangeEvent e);

В нем определены события с сигнатурой этих делегатных типов:

public event StudsRowChangeEventHandler StudsRowChanging;

public event StudsRowChangeEventHandler StudsRowChanged;

public event StudsRowChangeEventHandler StudsRowDeleting;

public event StudsRowChangeEventHandler StudsRowDeleted;

public event ExamsRowChangeEventHandler ExamsRowChanging;

public event ExamsRowChangeEventHandler ExamsRowChanged;

public event ExamsRowChangeEventHandler ExamsRowDeleting;

public event ExamsRowChangeEventHandler ExamsRowDeleted;

Есть классы, помогающие работать с параметрами событий (StudsRowChangeEvent и ExamsRowChangeEvent). Расссмотрим, например, структуру класса StudsRowChangeEvent, производного от EventArgs.

  

Вы видите, что вложенные класы имеют свои поля данных, свойства, перечисления, и события. Благодаря строгой типизации работать с объектами перечисленных классов значительно проще, чем с обобщенными классами DataSet, DataTable и DataRow.

Связи между таблицами описаны коллекцией Relations, в которой присутствует только один элемент.

DataRelation relationStudsExams;

Вновь созданные классы учитывают требования схемы Students.xsd, и содержат методы для обработки событий, генерируемых во время изменения данных таблиц.

·  В окне Class View поставьте фокус на класс StudsExams, нажмите правую кнопку мыши и выберите в контекстном меню команду Browse Definition. При этом откроется окно инструмента студии, называемого Object Browser. Вид его окна показан ниже.

При работе с Object Browser удобно пользоваться командой контекстного меню Go To Definition. С помощью этой команды убедитесь, что класс StudsExams содержит два свойства Studs и Exams, которые дают доступ к двум private-переменным tableStuds и tableExams.

Эти переменные являются ссылками на объекты классов StudsDataTable и ExamsDataTable, декларация которых вложена внутрь класса StudSet. Вы можете видеть это в левой панели Objects расщепленного окна Object Browser. Новый класс содержит ряд методов, которые позволяют выполнять важные операции с набором данных. Перечислим некоторые из них.

·  Метод InitClass — выполняет ряд инициализирующих действий, главными из которых являются: создание двух таблиц и связывание их по ключевому полю StudIDColumn.