Использование XML и LINQ в элементах управления TreeView и ListView - Добавление новых записей номеров телефонов сотрудников

ОГЛАВЛЕНИЕ

Добавление новых записей номеров телефонов сотрудников

Нашим последним заданием будет предоставление пользователю возможности добавления новых записей о номерах телефонов сотрудников к выбранному филиалу или отделу. Вставка элемента из ListView является задачей схожей с редактированием записи - оба интерфейса определяются посредством шаблонов. Чтобы указать интерфейс для вставки, используйте InsertItemTemplate. Данный шаблон может быть отображен в качестве первого или последнего элемента в ListView.

InsertItemTemplate (продемонстрирован ниже) выглядит так же для EditItemTemplate в том отношении, что он содержит TextBox для имени и номера телефона сотрудника. Вместо кнопки Update у нас будет кнопка Save (чье свойство CommandName установлено "XSave").

<InsertItemTemplate>
   <tr>
      <td style="border-bottom: solid black 1px;">
         <asp:LinkButton ID="lnkSave" runat="server" CommandName="XSave" Text="Save" />,
         <asp:LinkButton ID="lnkCancelInsert" runat="server" CommandName="Cancel" Text="Cancel" />
      </td>
      <td style="border-bottom: solid black 1px;">
          <asp:TextBox ID="txtInsertName" runat="server" Text='<%# Eval("Name") %>' />
      </td>
      <td style="border-bottom: solid black 1px;">
         <asp:TextBox ID="txtInsertTelephone" runat="server" Text='<%# Eval("Telephone") %>' />
      </td>
   </tr>
</InsertItemTemplate> 

Как и в случае с командами "XUpdate"и "XDelete", нам необходимо обработать команду "XSave" в обработчике события ItemCommand ListView. После сохранения элемента (посредством вызова saveNewItem), нам необходимо повторно привязать информацию к ListView, поэтому только что добавленный в список элемент будет отображен.

case "XSave":
   saveNewItem(e.Item);

   lvwEmployees.DataBind();
   break; 

Метод saveNewItem более сложен, чем методы saveChanges или deleteItem. Часть препятствий исходит из того факта, что каждый элемент в XML-файле имеет атрибут id с уникальным идентификатором для этого "уровня". Так что при добавлении нового элемента нам необходимо выбрать соответствующее значениеid.

Метод saveNewItem выполняет следующие действия:

  1. Загрузить корневой элемент (как и в других методах)
  2. Получить XPathAddress выбранного в TreeView элемента и найти элемент в XML-файле
  3. Получить максимальное значение ID из всех элементов в корневом элементе
  4. Создать новый объект XElement
  5. Добавить новый элемент к его родителю и сохранить в файле

Следующий код демонстрирует это :

protected void saveNewItem(ListViewItem lvwItem)
{
   string fileName = MapPath("PhoneBook.xml");

   XElement rootElement = XElement.Load(fileName);

   string xPath = tvwPhoneBook.SelectedNode.DataPath.Substring(tvwPhoneBook.Nodes[0].DataPath.Length);

   XElement parentElement = rootElement.XPathSelectElement(xPath);

   int maxId = parentElement.Elements().Max(c => int.Parse(c.Attribute("id").Value));

   XElement newElement = new XElement("Employee",
            new XAttribute("id", (maxId + 1).ToString()),
            new XAttribute("name", ((TextBox)lvwItem.FindControl("txtInsertName")).Text),
            new XAttribute("telephone", ((TextBox)lvwItem.FindControl("txtInsertTelephone")).Text));

   parentElement.Add(newElement);

   rootElement.Save(fileName);

И все! Небольшим усилием и парочкой строк кода мы создали работоспособное приложение ASP.NET для редактирования структурированной XML-информации. Главной идеей, на которой основано приложение, является связь между TreeView и ListView, что дало нам возможность редактировать табличные данные, хранимые в более иерархической XML-структуре. Большая часть работы выполняется за нас элементами TreeView, ListView, DataPager и LinqDataSource. Все что нам необходимо было сделать, так это написать код, который обрабатывает позицию записи в различных уровнях XML-структуры.


Веселого программирования!

Miroslav Kadera

Скачать исходники примеров: часть 1, часть 2.