20 октября 2019 года    
Воскресенье | 15:26    
Главная
 Новости
Базы данных
Безопасность PC
Всё о компьютерах
Графика и дизайн
Интернет-технологии
Мобильные устройства
Операционные системы
Программирование
Программы
Связь
Сети
 Документация
Статьи
Самоучители
 Общение
Форум







Разделы / Интернет-технологии / XML

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

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

Введение

Не следует забывать, что по своей природе XML-данные не табличные, а иерархические в виде дерева, поэтому использование терминов "таблица", "поле", "запись" достаточно условны.  Таблица возникает только в том случае, если несколько "веток" (элементы XML) XML-"дерева" (документ XML) повторяются. С другой стороны нам никто не запрещает создавать таблицы с одной записью.

Создание формы редактирования

Добавим новую форму, с помощью которой будем редактировать таблицы: Project -> Add Windows Form. Назовем форму как EditTable (для этого достаточно при создании форму назвать файл с ее классом EditTable.cs).

Поместим слева на форму ListBox и назовем его listColumns - он будет отображать поля редактируемой таблицы. Также добавим следующие текстовые поля на форму:

  • txtName - имя редактируемой таблицы
  • txtCaption - заголовок, редактируемого столбца

Добавим список ComboBoxType - comboBoxType - он будет содержать типы данных .NET. Инициализируем его свойство Items следующими значениями

  • System.String
  • System.Int32
  • System.Double

Ну и хватит, пожалуй.

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

  • btnAddColumn - добавление нового поля.
  • btnEdit - сохранение изменений редактируемого поля
  • btnRemoveColumn - удаление поля.
  • btnOK и btnCancel - ну их смысл очевиден. Если нажимаешь OK все изменения сохраняются, Cаncel - изменения отменяются. Присвоим свойству DialogResult кнопки btnOK значение "OK", а для кнопки btnCancel - значение "Cancel".

Добавим метод UpdateListColumns() - он будет выводить список полей таблицы в listColumns.

//Обновление списка полей таблицы
private void UpdateListColumns()
{
	listColumns.Items.Clear();

	foreach(DataColumn col in table.Columns)
	{
		listColumns.Items.Add(col.Caption);
	}
}

Переопределим конструктор таблицы, который теперь будет принимать объект DataTable - редактируемую таблицу:

public EditTable(DataTable table)
{
	InitializeComponent();

	this.table = table;

	this.UpdateListColumns();

	txtName.Text = table.TableName;
}

Добавим обработчик события Leave - потеря фокуса - текстового поля txtName. В нем мы будем изменять имя таблицы:

//Изменение имени таблицы
//на потерю фокуса поля с этм именем
private void txtName_Leave(object sender, System.EventArgs e)
{
	table.TableName = txtName.Text;
}

Определим код обработчика Click книпоки btnAddColumn (как вы помните для добавления обработчика события нажатия кнопки достаточно кликнуть по ней два раза в дизайнере формы)

//Добавление поля
private void dtnAddColumn_Click(object sender, System.EventArgs e)
{
	//Создание нового поля и определение его заголовка
	DataColumn col = new DataColumn(txtCaption.Text);
	//Определение типа поля
	col.DataType = Type.GetType(comboBoxType.Text);

	//добавление поля
	table.Columns.Add(col);

	//обновление списка полей
	this.UpdateListColumns();
}

Редактирование колонки - btnEdit

//Правка текущего поля
private void btnEdit_Click(object sender, System.EventArgs e)
{
	DataColumn col = table.Columns[listColumns.SelectedItem.ToString()];

	//Если есть данные - возникнет исключение на изменение типа поля
	if(table.Rows.Count == 0)
	{
		col.DataType = Type.GetType(comboBoxType.Text);
	}
	col.Caption = txtCaption.Text;

	this.UpdateListColumns();
}

Удаление колонки - btnRemoveColumn

//удаление поля
private void btnRemoveColumn_Click(object sender, System.EventArgs e)
{
	table.Columns.Remove(listColumns.SelectedItem.ToString());

	//обновление списка полей
	this.UpdateListColumns();
}

Добавим обработчик события SelectedIndexChanged списка полей таблицы listColumns

//Отображение данных текущего поля
private void listColumns_SelectedIndexChanged(object sender, System.EventArgs e)
{
	txtCaption.Text = table.Columns[listColumns.SelectedItem.ToString()].Caption;
	comboBoxType.Text = table.Columns[listColumns.SelectedItem.ToString()].DataType.ToString();
}

Вот и все форма готова.

Добавление меню редактирования на главную форму.

Теперь в главной форме приложения надо добавить меню Edit и добавить для него пункты:

  • Delete Table
  • Add Table
  • Edit Table

Определим их обработчики. При удалении таблицы достаточно удалить текущий объект DataTable из объекта DataSet.

При добавлении таблицы добавляем в объект DataSet новую таблицу и вызываем нашу форму редактирования EditTable для редактирования новой таблицы. Потом отслеживаем какая кнопка формы редактирования была нажата. Если "OK" - таблицу добавляем, если "Cancel" - не добавляем.

Аналогично, для редактирования таблицы - вызываем офрму редактирования. Если нажата кнопка "OK" -изменения сохраняем.

//Удаление таблицы
private void menuItemDelete_Click(object sender, System.EventArgs e)
{
	//Удаление таблицы из dataSet
	dataSet.Tables.Remove(listTables.SelectedItem.ToString());
	//Применение изменений
	dataSet.AcceptChanges();

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

}
//Добавление таблицы
private void menuItemAdd_Click(object sender, System.EventArgs e)
{
	DataTable table = new DataTable(DateTime.Now.ToString());

    EditTable editForm = new EditTable(table);
	//Открываем окно редактирования новой таблицы
	if(editForm.ShowDialog() == DialogResult.OK)
	{
		//Если нажата кнопка "OK" сохраняем изменения в dataSet
		dataSet.Tables.Add(table);
		dataSet.AcceptChanges();
		this.UpdateTableList();
	}
	else
	{
		//Иначе отбрасываем изменения
		dataSet.RejectChanges();
	}
}
//Правка текущей таблицы
private void menuItemEditTab_Click(object sender, System.EventArgs e)
{
	DataTable table = dataSet.Tables[listTables.SelectedItem.ToString()];
	EditTable editForm = new EditTable(table);
	if(editForm.ShowDialog() == DialogResult.OK)
	{
		dataSet.AcceptChanges();
		this.UpdateTableList();
	}
	else
	{
		dataSet.RejectChanges();
	}
}

Заключение

Итак, мы создали пример приложения, работающего с XML-данными. Пусть вас не путают термины "таблица" и.т.д. мы имеем дело не с реляционной базой данных, а с иерархической древовидной структорой - XML. Просто в XML-формате можно сохранять табличные данные, аналогично данные XML можно представлять в виде таблиц. Другое дело, что, как я уже писал, таблицы могут состоять только из одной записи.

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


2006 (c) Copyright Hardline.ru