Создание приложения, работающего с XML-данными

Опубликовано с разрешения автора http://www.daoto.net/

Введение.

В последнее время завоевывает популярность новый формат данных - XML. Одним из его достоинств является то, что это самописываемый формат данных, что значительно облегчает работу с ним. Тем не менее, многих все еще пугает само слово "XML". В этой статье я постараюсь доказать простоту и удобство работы с XML-данными на примере приложения, которое отображает XM_-данные в удобной человеку форме и позволяет редактировать их.

Для начала не будем забираться в дебри пространства имен System.XML, а обойдемся объектом DataSet пространства имен System.Data.

У объекта DataSet есть два замечательных метода: ReadXml() и WriteXml() - первый считывает данные в формате XML в объект DataSet, а второй их выводит. Эти методы перегружены, и позволяют вам как считать данные из файла на диске, или из потока Stream в оперативной памяти, так и вывести как в файл на диске, так и в Stream.

Подготовка формы

Итак приступим к созданию приложения. Для этого создадим новый C#-проект Windows Application. (File - New - Projects в Visual Studio .NET).

Теперь приступим к подготовке формы:

  1. "Бросим" на форму компонент ListBox и дадим ему имя - listTables (имя дается с помощью свойства Name). "Пришвартуем" его к левому краю формы, указав в свойстве Dock значение "Left". Как вы уже догадались - он будет отображать список таблиц в XML - файле.
  2. Затем поместим на форму копмонент Splitter, который позволит нам менять относительные размеры компонентов на форме. И укажем в свойстве Dock - "Left".
  3. Затем поместим на форму объект DataGrid, который будет отображать табличные данные. Обзовем его как dataGrid, а в свойстве Dock укажем - Fill.

Затем поместим на форму еще три компонента (после помещения на форму они отобразятся ПОД формой):

MainMenu - главное меню приложения, назовем его как mainMenu.

OpenFileDialog - диалог открытия файла. Назовем его openFileDialog.

SaveFileDialog - дилог сохранения файла. Понятно, что его будеи звать saveFileDialog.

Написание кода

Добавим новую переменную dataSet в класс формы

private DataSet dataSet;

Добавим функцию UpdateListtables(), которая будет обновлять список таблиц в listTables. Для этого она будет просто пробегать по списку таблиц в dataSet и отображать их имена в listTables.

//Обновление списка таблиц
private void UpdateTableList()
{
	//Очищаем список таблиц
	listTables.Items.Clear();
	//Пробегаемся по таблицам dataSet
	foreach(DataTable table in dataSet.Tables)
	{
		listTables.Items.Add(table.TableName);
	}
	
	if(listTables.Items.Count > 0)
		listTables.SelectedIndex = 0;
}	

Затем в конструкторе нашей формы проинициализируем наши компоненты. Свою форму я назвал как DataXnlForm, следовательно конструктор зовется DataXmlForm().

 public DataXmlForm() 
{
	InitializeComponent();

	//Обавляем фильтр для fileOpenDialog
	openFileDialog.Filter = "XML - files (*.xml)|*.xml|All files (*.*)|*.*";
	//Говорим ему воостанавливать последнюю диреторию
	openFileDialog.RestoreDirectory = true;

	saveFileDialog.Filter = "XML - files (*.xml)|*.xml|All files (*.*)|*.*";
	saveFileDialog.RestoreDirectory = true;

	//Создаем новый DataSet
	//точнее вызываем его контсруктор
	dataSet = new DataSet();
}

Теперь будем работать с mainMenu. Набирая наименование пункта в меню в поле, где написано "Type here", мы можем добавить новый пункт.

Итак добавим корневой пункт - File, назовем его menuItemFile. Кликаем по неиу один раз и в раскрывшемся ниже списке добавляем пункты Open (имя - menuItemOpen), Save (menuItemSave), Close (menuItemClose). Кликая два раза по нужному пункту меню мы можем добавить обработчик. Итак кликнем по 2 раза по пунктам "Open", "Save", "Close"., мы добавим обработчики на них. В ообработчике пункта меню Open будет следующее:

	//Открытие файла
private void menuItemOpen_Click(object sender, System.EventArgs e)
{
	
	if(openFileDialog.ShowDialog() == DialogResult.OK)
	{
		//Считывание XML - данных в dataSet
		dataSet.ReadXml(openFileDialog.FileName);
		//Принятие изменений dataSet
		dataSet.AcceptChanges();

		//Обновление списка таблиц
		this.UpdateTableList();

		//Изменение заголовка окна
		this.Text = "Data Xml  "+openFileDialog.FileName;
	}
}
	

Если мы выбираем какой-либо файл, то он считывается в dataSet. Аналогично сохранение файла, а закрытие программы, вообще, можно оставитьь без комментариев настолько оно просто:

//Сохранение XML-данных
private void menuItemSave_Click(object sender, System.EventArgs e)
{
	saveFileDialog.FileName = openFileDialog.FileName;
	if(saveFileDialog.ShowDialog() == DialogResult.OK)
	{
		//Запись XML-данных из dataSet на диск
		dataSet.WriteXml(saveFileDialog.FileName);

		//Обновление заголовка окна
		this.Text = "Data XML  "+saveFileDialog.FileName;
	}
}

//выход из приложения
private void menuItemClose_Click(object sender, System.EventArgs e)
{
	Application.Exit();
}

Далее нам необходимо, чтобы при выделении таблицы в listTables, она отображалась в dataGrid. Для добавления обработчика дважды кликаем по listTables. Чтобы показать dataGrid'у откуда брать данные воспользуемся свойством DataSource, в котором укажем dataSet. А чтобы показать какую именно таблицу отображать из dataSet используем свойство DataMember:

//Изменение отображаемой таблицы
private void listTables_SelectedIndexChanged(object sender, System.EventArgs e)
{
	//указываем источник данных dataGrid
	dataGrid.DataSource = dataSet;
	//указываем отображаемую таблицу
	dataGrid.DataMember = listTables.SelectedItem.ToString();
	//имзеняем заголовок dataGrid
	dataGrid.CaptionText = listTables.SelectedItem.ToString();
}

Итак мы получили практически готовое приложение, которое позволяет отображать и редактировать XML-данные. О том как редактировать не только содержание таблиц, но и сами таблицы, я собираюсь описать в продолжении этой статьи.

Исходники приложения (26.2 KB)

Александр Игнатьев, 7 апреля 2004
http://www.daoto.net/, e-mail: daoto@daoto.net



Опубликовал admin
14 Апр, Среда 2004г.



Программирование для чайников.