https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx |
Элементы-потребители данных. 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" .