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

foreach (XmlNode node in nodes)

   WriteChildren(node);

Так как узлы первого уровня содержат вложенные узлы, то для отображения иерархической структуры документа необходим рекурсивный  проход вглубь дерева, который и реализован в методе WriteChildren. Не забудьте вставить вызов метода ShowXml внутрь MainForm_Load.

ShowXml(@"\Students.xml");

Компонент XmlRichTextBox можно инициализировать значительно проще, без процедуры синтаксического разбора, но тогда мы потеряем цветовое форматирование и точное имя таблицы. Рассмотрим этот вариант. В методе ShowXml класса MainForm временно замените вызов box.ShowXml(FindAFile(fileName), "/StudentsList"); следующим кодовым фрагментом.

DataSet ds = new DataSet();

ds.Tables.Add ((gridStud.DataSource as BindingSource).DataSource as DataTable);

box.Text = ds.GetXml();

Здесь иллюстрируется метод GetXml() класса DataSet. Он возвращает представление всего набора данных в виде текстовой строки. Эта строка является XML-представлением набора данных DataSet. Имена NewDataSet и Table1 были автоматически сгенерированы объектом DataSet.

Заметьте, что наш компонент здесь не работает, точнее работает только его родительский класс RichTextBox. Свойство Text позволяет задать содержимое окна RichTextBox. Если бы у нас имелся текст в формате RTF, то содержимое окна можно было бы задать с помощью свойства Rtf, а не Text.

Сортировка и фильтрация данных

Упорядочить и отфильтровать данные можно двумя способами: с помощью метода Select класса DataTable или с помощью настроенного на фильтрацию объекта класса DataView. Действие последнего напоминает действие объекта VIEW SQL-сервера или Access. Объект класса DataView содержит некое отобранное (отфильтрованное) подмножество данных, хранимых в DataTable и позволяет сортировать его по какому-либо из полей.

Рассмотрим, как работать с DataView (образом таблицы) на примере учебной базы данных Northwind.mdb. Вы найдете ее в папке с материалами курса.

·  Создайте новый проект OleDBSort, или скопируйте предыдущий,

·  В случае нового проекта добавьте на форму DataGridView с именем grid, добавьте метку с текстом City: и выпадающий список — comboCity. Мы наполним его именами городов из таблицы Customers.

·  Введите в класс формы переменную: DataView dv; и переменную BindingSource bs;

·  Добавьте реакцию формы (если ее нет) на событие Load и SelectedIndexChanged для списка comboCity.

·  Принесите в папку Data файл с базой данных Northwind.mdb.

Мы собираемся предоставить пользователю возможность выбирать в списке ComboBox город (поле City таблицы Customers) и использовать его для фильтрации строк таблицы. Объект DataView должен содержать только те строки таблицы, которые соответствуют клиентам, живущим в выбранном городе.

·  Скорректируйте метод MainForm_Load так, чтобы он создал соединение с базой Northwind.

·  В метод ConnectAndRead введите код, показанный ниже.

  void ConnectAndRead()

  {

   cn.Open();

   IDbCommand cmd = new OleDbCommand("SELECT * FROM Customers", cn);

   IDataReader reader = cmd.ExecuteReader();

   DataTable dt = new DataTable("Customers");

   dt.Columns.Add("Name"); dt.Columns.Add("City");

   dt.Columns.Add("Phone"); dt.Columns.Add("Company");

   while (reader.Read())

   {

    DataRow row = dt.NewRow();

    row["Name"] = reader["ContactName"];

    row["City"] = reader["City"];

    row["Phone"] = reader["Phone"];

    row["Company"] = reader["CompanyName"];

    dt.Rows.Add(row);

   }

   comboCity.DataSource = dt;

   comboCity.DisplayMember = "City";

   comboCity.ValueMember = "City";

   comboCity.SelectedIndex = -1;

   comboCity.SelectedIndexChanged += new EventHandler(comboCity_SelectedIndexChanged);

   dv = new DataView(dt);

   bs = new BindingSource(dv, "");

   bn.BindingSource = bs;

   grid.DataSource = bs;

   reader.Close();

   cn.Close();

  }