ASP .NET документация.

Введение

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