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

Введение

Окончание статьи Создание приложения, работающего с XML-данными. Рассмотрено редактирование, удаление и добавления таблиц (или элементов в терминах информационного множества XML Infoset).


Не следует забывать, что по своей природе 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 можно представлять в виде таблиц. Другое дело, что, как я уже писал, таблицы могут состоять только из одной записи.

22 октября 2006 в 12:08
Материалы по теме
{"url":"http://www.fastvps.ru/", "src":"/images/advbanners/fastvps.png", "alt":"Хостинг Fastvps.ru. Наш выбор!"}
Заработок