Выбрать главу

9. В окне свойств Properties укажите значение grdData для свойства (Name) сетки.

10. Увеличьте размер сетки grdData, чтобы она занимала до 80% всей площади формы.

В верхней части файла введите следующий код:

Imports System

Imports System.Data

Imports System.Data.SqlClient

Затем в определении класса формы frmXML введите код из листинга 10.1.

Листинг 10.1. Код чтения содержимого XML-файла в объект DataSet

Private Sub btnReadXML_Click(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) Handles btnReadXML.Click

 Dim dsPubs As New DataSet()

 ' Чтение XML-данных из файла.

 dsPubs.ReadXml("..\Pubs.xml")

 ' Связывание объекта DataSet с сеткой данных DataGrid.

 grdData.DataMember = "publishers"

 grdData.DataSource = dsPubs

End Sub

Эта подпрограмма считывает XML-данные из файла pubs.xml в объект DataSet. Теперь объект DataSet и его данные могут использоваться любым из способов, описанных в предыдущих главах. Кроме того, эта подпрограмма связывает объект DataSet с сеткой данных DataGrid. В листинге 10.2 показано содержимое файла pubs.xml, а на рис. 10.1 — данные в сетке DataGrid.

РИС. 10.1. Содержимое файла pubs.xml в сетке DataGrid

Листинг 10.2. Содержимое файла pubs.

<?xml version="1.0" standalone="yes"?>

<NewDataSet>

 <publishers>

  <pub_id>0736</pub_id>

  <pub_name>New Moon Books</pub_name>

  <city>Boston</city>

  <state>MA</state>

  <country>USA</country>

 </publishers>

 <publishers>

  <pub_id>0877</pub_id>

  <pub_name>Binnet & Hardley</pub_name>

  <city>Washington</city>

  <state>DC</state>

  <country>USA</country>

 </publishers>

 <publishers>

  <pub_id>1389</pub_id>

  <pub_name>Algodata Infosystems</pub_name>

  <city>Berkeley</city>

  <state>CA</state>

  <country>USA</country>

 </publishers>

 <publishers>

  <pub_id>1622</pub_id>

  <pub_name>Five Lakes Publishing</pub_name>

  <city>Chicago</city>

  <state>IL</state>

  <country>USA</country>

 </publishers>

 <publishers>

  <pub_id>1756</pub_id>

  <pub_name>Ramona Publishers</pub_name>

  <city>Dallas</city>

  <state>TX</state>

  <country>USA</country>

 </publishers>

 <publishers>

  <pub_id>9952</pub_id>

  <pub_name>Scootney Books</pub_name>

  <city>New York</city>

  <state>NY</state>

  <country>USA</country>

 </publishers>

 <publishers>

  <pub_id>9999</pub_id>

  <pub_name>Lucerne Publishing</pub_name>

  <countгу>France</country>

 </publishers>

</NewDataSet>

НА ЗАМЕТКУ

После вызова метода ReadXML для загрузки данных в объект DataSet для свойства RowState всех новых строк задается значение Added. Этот подход отличается от принятого по умолчанию поведения, когда для загрузки данных в объект DataSet из базы данных используется объект DataAdapter и для свойства RowState всех новых строк задается значение Unchanged. Такой подход позволяет загружать данные из XML-источника и вставлять их в таблицу базы данных. Если вы не хотите этого делать, то можно с помощью метода AcceptChanges переустановить значение Unchanged для свойства RowState всех новых строк. Для изменения принятого по умолчанию поведения при загрузке данных в объект DataSet из базы данных можно указать значение False для свойства АсcеptChangesOnFill что приведет к автоматической установке значения Added для свойства RowState всех новых строк.

В данном примере демонстрируется простейший способ чтения XML-данных в объект DataSet, т.е. чтение из файла. Помимо этого способа, существует много других вариантов чтения XML-данных с помощью перегруженных версий метода ReadXML, например с помощью объектов Stream, TextReader или XmlReader. Соответствующие им перегруженные версии метода ReadXML содержат второй параметр со значением XmlReadMode. Этот параметр используется для указания способа интерпретации содержимого XML-источника и обработки схемы данных. В табл. 10.1 приведено краткое описание членов перечисления XmlReadMode.

Таблица 10.1. Перечисление XmlReadMode 

Имя члена перечисления Описание ReadSchema Считывает любую встроенную схему и загружает ее вместе с данными в объект DataSet. Таблицы, определенные в схеме, вставляются в объект Data-Set, но если схема определяет таблицу, которая уже есть в этом наборе данных, то генерируется исключительная ситуация IgnoreSchema Игнорирует любую встроенную схему и загружает данные в объект DataSet с помощью существующего определения схемы. Любые данные, которые не соответствуют схеме объекта DataSet, игнорируются и не загружаются. Аналогично, если схема не определена, то данные не загружаются InferSchema Игнорирует любую встроенную схему и выводит схему на основе структуры данных, а затем загружает данные в объект DataSet. Дополнительные таблицы и поля, определенные в результате такого анализа структуры данных, добавляются в уже существующую схему в объекте DataSet. В случае конфликта определений генерируется исключительная ситуация Fragment Считывает все существующие XML-фрагменты и загружает данные в объект DataSet. Любые данные, которые не соответствуют схеме в объекте DataSet, игнорируются и не загружаются DiffGram Считывает данные в формате DiffGram и загружает данные в объект DataSet. Новые записи сливаются с уже существующими записями с такими же значениями уникального идентификатора, в противном случае в объекте DataSet создаются новые записи. В случае несоответствия схем генерируется исключительная ситуация. (Формат DiffGram более подробно описывается далее в главе. — Прим. ред.) Auto Этот режим используется по умолчанию. При этом выполняется одна из следующих операций: если XML-данные имеют формат DiffGram, то выбирается член DiffGram перечисления XmlReadMode; если схема определена в объекте DataSet или встроена в XML-документ, то выбирается член ReadSchema перечисления XmlReadMode; в остальных случаях выбирается член InferSchema перечисления XmlReadMode