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