Использование 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 выполняет следующие действия:
- Загрузить корневой элемент (как и в других методах)
- Получить XPathAddress выбранного в TreeView элемента и найти элемент в XML-файле
- Получить максимальное значение ID из всех элементов в корневом элементе
- Создать новый объект XElement
- Добавить новый элемент к его родителю и сохранить в файле
Следующий код демонстрирует это :
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