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

·  В любом из cs-файлов проекта найдите строку namespace StudentsOleDb. Поставьте фокус на StudentsOleDb, вызовите контекстное меню и выберите команду Refactor®Rename. Замените имя пространства имен на OleDbOneTable и нажмте OK.

·  Запустите проект (Ctrl+F5) и убедитесь, что приложение работает так же, как и ранее.

·  Закройте решение (команда File®Close Solution) и согласитесь с тем, что надо создать и сохранить файл решения (OleDbOneTable.sln). Аккуратно выберите его местоположение (внутри папки решения, не проекта).

Теперь продолжим работу с оригиналом — проектом StudentsOleDb.

·  Откройте старое решение StudentsOleDb (оригинал).

·  Уберите весь код последних опытов работы с DataRowVersion и DataViewRowState.

·  Переименуйте второй, вспомогательный DataGridView (gridChange) в gridExam.

·  Добавьте в навигатор кнопку btnReject для отмены изменений и установите для нее свойство Text = "Cancel Changes", а также свойство Image (рекомендую отыскать изображение Edit_UndoHS.png).

·  Существующие элементы DataGridView вложены в панели SplitContainer. Если вы захотите вставить еще один DataGridView, то целесообразно вставить дополнительный SplitContainer. Это потребует некоторых усилий, но даст полезный опыт работы с дизайнером студии. Аккуратно работайте со свойством Dock.

Механизм DataBinding

DataSet — полностью отсоединенный от источника данных контейнер (в отличие от Recordset из технологии ADO). В связи с этим он не нуждается в поддержке понятия текущая запись (курсор таблицы). Все записи в наборе данных доступны. Так как понятие курсора отсутствует, то в классе DataTable нет свойства или метода, которые позволили бы получить ссылку на текущую запись или переместиться от одной записи к другой. Это сбивает с толку программистов, привыкших работать с ADO, где поддерживается указатель текущей записи и есть методы навигации по записям. У меня (думаю, что и у вас) такой проблемы не было, так как не было опыта и навыков работы с ADO.

В общем каркасе .NET Framework и классах из пространства имен System.Windows.Forms существует и функционирует множество объектов — синхронизаторов текущей позиции. Они поддержаны классами: CurrencyManager и PropertyManager и являются частью механизма DataBinding. Важно научиться пользоваться их услугами. Синхронизатор типа CurrencyManager (или его класс-обертка — BindingSource) восполняет указанный пробел (отсутствие понятия курсора таблицы базы данных). В первой части курса мы уже работали с двумя объектами BindingSource. Сейчас мы вновь задействуем эти объекты.

·  Проверьте поля данных класса MainForm, и добавьте необходимые переменные, если они отсутствуют.

  string dbPath;

  DataSet ds;

  OleDbConnection cn;

  OleDbDataAdapter da;

  BindingSource bsStuds, bsExams;

·  В момент начальной загрузки формы выполните следующие действия.

  void MainForm_Load(object sender, EventArgs e)

  {

  try

   {

    cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +

      FindAFile("\\Students.mdb"));

    ConnectAndRead();

   }

   catch (Exception ex)

   {

    MessageBox.Show(ex.Message, Text);

    Application.Exit();

    return;

   }

  }

Для создания объекта DbConnection необходимо точно указать файловый путь к MDB-файлу с базой данных. Метод FindAFile помогает отыскать этот файл. Такое решение (отсутствие жестко заданного пути к базе данных) упрощает перенос проекта с компьютера на компьютер. Поиск начинается с папки, где расположен исполняемый модуль (Environment.CurrentDirectory), продолжается вверх по иерархии файлового дерева, вплоть до корневой директории диска. Если и там файл не обнаружен, то выбрасывается исключение. Класс Path из пространства имен System.IO имеет ряд полезных, статических методов, которые должны быть в арсенале программиста.

  string FindAFile(string file)

  {

   dbPath = Environment.CurrentDirectory;

   string root = Path.GetPathRoot(dbPath);

   while (true)

   {

    string data = dbPath + "\\Data",