Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5898 / 532 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 8:

Элементы-потребители данных. Data-Bound Controls

В момент начала редактирования текстовые поля прячутся, так как значения из полей редактирования внутри таблицы будут копироваться туда, и нужно скрыть это от пользователя. Кроме того, эти элементы управления во время редактирования не нужны:

protected void UsersDataGrid_EditCommand(object source, 
DataGridCommandEventArgs e)
{
    UsersDataGrid.EditItemIndex = e.Item.ItemIndex;
    NameTextBox.Visible = false;
    CommentTextBox.Visible = false;
    Registered.Visible = false;
    UsersDataGrid.DataBind();
}

Редактирование — сложнее. В шаблоне столбцов элемента DataGrid указаны текстовые поля, которые появляются после нажатия на ссылку "Редактировать". Значения параметров надо брать оттуда, но их нельзя указать в декларации SqlDataSource, потому что в момент генерации страницы их там просто нет. Например, для того чтобы установить в режим редактирования строку DataGrid, необходимо присвоить свойству EditItemIndex элемента управления DataGrid значение индекса текущей строки.

В событии UpdateCommand в аргументе e находим текущую строку. Обновляемые данные находятся в TextBox -ах в ячейках 0 и 1. Чтобы выйти из режима редактирования, свойству EditItemIndex нужно присвоить значение - 1:

protected void UsersDataGrid_UpdateCommand(object source, 
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
    TableCell cell=e.Item.Cells[0];
    TextBox cnt = (TextBox)cell.FindControl("NameTextBox");
    NameTextBox.Text = cnt.Text; 

    cell = e.Item.Cells[1];
    cnt = (TextBox)cell.FindControl("CommentTextBox");

    CommentTextBox.Text = cnt.Text;
    HiddenField1.Value = 
UsersDataGrid.DataKeys[e.Item.ItemIndex].ToString();
    cell = e.Item.Cells[2];
    CheckBox check = (CheckBox)cell.FindControl("Registered");
    Registered.Checked = check.Checked;
    SqlDataSource1.Update();

    UsersDataGrid.EditItemIndex = -1;

    UsersDataGrid.DataBind();
    NameTextBox.Text = "";
    CommentTextBox.Text = "";
    NameTextBox.Visible = true;
    CommentTextBox.Visible = true;
    Registered.Visible = true;
}

После обновления вновь читаем данные и делаем видимыми поля редактирования.

Отказ от редактирования без сохранения изменений обрабатывается в событии CancelCommand:

protected void UsersDataGrid_CancelCommand(object source, 
DataGridCommandEventArgs e)
{
    UsersDataGrid.EditItemIndex = -1;
    NameTextBox.Visible = true;
    CommentTextBox.Visible = true;
    UsersDataGrid.DataBind();
}

Заключение

Мы рассмотрели 3 элемента управления, существовавшие с ASP .NET 1.0. Repeater использует только шаблоны, DataList создает таблицу и пользуется шаблоном для отображения ее строк, а DataGrid может обходиться и без шаблонов. Примерно такая же система существует и у новых элементов управления ASP .NET 2.0.

Объектная модель упрощает связывание с данными, но ее реальная мощь проявляется при использовании новых элементов управления GridView, DetailsView, FormView, которые мы рассмотрим в "Элементы-потребители данных ASP .NET 2.0" .

Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319