Введение в ADO.NET. Источник данных - XML-файл. Отображение данных связанной таблицы, страница 17

Пока не понятно, как вообще избавиться от времени, которое, очевидно, является лишним. Сложное лекарство было упомянуто ранее — при записи в файл не пользоваться методом WriteXml, а работать методами класса XmlDocument, на ходу управляя форматом даты.

Задание

¨  Добавьте возможность поиска студентов по среднему баллу, значение которого попадает в интервал [mln, max]. Добавьте элементы интерфейса для ввода границ интервала.

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

¨  Те, кто чувствует себя уверенно, добавьте возможность выбора строки в списке ListView и синхронизации (отслеживания) позиции в активном DataGridView. Это не так просто, потому, что ListView способен отображать данные обеих таблиц. При навигации к экзамену другого (неактивного) студента необходимо синхронизировать studsGrid (прокрутить строки, выбрать строку и выделить ячейку), examsGrid при этом должен отследить позицию (перегрузиться) автоматически.

Здесь приведено одно из решений поиска студентов по среднему баллу.

  void FilterAverage()

  {

    float low, hi;

    bool ok = float.TryParse(tAverageLow.Text, out low);

    ok &= float.TryParse(tAverageHi.Text, out hi);

    if (!ok)

      return;

    // Здесь ваш код

    sNotFound.Visible = false;

    FillList(rows, criteria);

  }

Детали

Полезно добавить возможность автоматического открытия файла последнего документа. Это должно происходить при начальном запуске приложения. Для этой цели в момент записи документа в файл мы создаем или открываем ключ Windows-реестра и запоминаем его файловый путь. Другой (более современный) способ — использовать global::Properties.Settings. Рассмотрим способ с использованием реестра.

¨  В момент записи в файл (или закрытия формы) производим запись в реестр:

RegistryKey key = Registry.CurrentUser.CreateSubKey (@"Software\MySoft\StudExam");

key.OpenSubKey ("StudExam", true);

key.SetValue ("Last File", fileName);

¨  В момент загрузки формы (в реакции на событие Load), мы обращаемся к реестру, узнаем путь к последнему файлу и открываем его.

void MainForm_Load(object sender, EventArgs e)

{

  SetDesktopLocation(10, 10);

  comboFind_SelectedIndexChanged (comboFind, EventArgs.Empty);

  RegistryKey key = Registry.CurrentUser.OpenSubKey (@"Software\MySoft\StudExam");

  fileName = null;

  if (key != null && (fileName = (string)key.GetValue ("Last File")) != null)

      Open (fileName);

}

Более современным подходом (вместо использования Windows-реестра) считается использование XML-файла настроек Settings.settings. Такой файл уже есть в вашем проекте, но пока не задействован.

¨  Создание и настройку компонентов BindingSource и BindingNavigator можно полностью выполнить в режиме дизайна.

Образ таблицы DataView

Объект класса DataView не имеет своих данных, он работает с данными ассоциированного с ним объекта DataTable. Методы класса DataView позволяют преобразовать табличные данные. Их можно отфильтровать, или отсортировать. Следующий фрагмент иллюстрирует сказанное.

DataView view = new DataView(ds.Tables[0]);    // Создаем образ таблицы студентов

view.RowFilter = "Name LIKE 'C*'";   // Настраиваем фильтр отбора строк

view.Sort = "Addr DESC";             // Настраиваем режим сортировки

viewGrid.DataSource = view;          // Привязываем viewGrid к образу таблицы

Предполагается, что на форме есть еще один DataGridView с именем viewGrid. Последний оператор оправдывает необходимость существования классаDataView. Дело в том, что отфильтровать и отсортировать данные можно было бы с помощью метода Select класса DataTable. Для этой цели класс DataView не нужен. Но вот привязать элемент отображения (DataGridView, или ComboBox) к данным, возвращаемым методом Select, нам бы не удалось, так как привязка осуществляется с помощью свойств, а Select возвращает массив объектов DataRow[], каждый из которых можно представить в виде массива обезличенных объектов. Напомню, что класс DataRow имеет два индексатора для выбора полей данных (колонок). Вывод: DataView умеет делать все, что делает метод Select класса DataTable, но добавляет способность привязки к своим данным.