Практическое руководство. Предоставление пользователям разрешения на изменение элементов в серверном веб-элементе управления DataList
Обновлен: Ноябрь 2007
Можно разрешить пользователям править отдельные элементы в серверном веб-элементе управления DataList. Когда для отдельного элемента задается режим редактирования, значения, которые могут быть изменены, обычно отображаются в виде текстовых полей или других элементов управления, допускающих изменение значения пользователями.
Предоставление пользователям разрешения на редактирование элементов в элементе управления DataList
Для элемента управления DataList задайте свойству DataKeyField значение имени поля, выраженное в данных, которые содержат первичный ключ.
Создайте свойство ItemTemplate (а также, если необходимо, свойство AlternatingItemTemplate), затем добавьте в данное свойство серверный веб-элемент управления Button. Задайте свойству для данной кнопки CommandName значение edit.
Примечание. Можно использовать элемент управления LinkButton или ImageButton для любого шага, на котором происходит вызов серверного веб-элемента управления Button.
Создайте свойство EditItemTemplate для элемента управления DataList, содержащее следующие элементы:
Элементы управления для всех изменяемых значений. Например, для всех знаков и числовых данных включите элементы управления TextBox. Используйте декларативный метод Eval, чтобы указать, к какому полю привязан каждый элемент управления, как показано в следующем примере.
Примечание о безопасности. В данном примере имеется текстовое поле для ввода пользовательских данных, которые представляют потенциальную угрозу безопасности. По умолчанию на веб-страницах ASP.NET проверяются введенные пользователем данные на наличие сценариев и HTML-элементов. Дополнительные сведения см. в разделе Общие сведения об использовании сценариев.
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("ProductName") %>' />
Элементу управления Button с помощью свойства Text задается значение «Update», а свойству CommandName задается значение update (с учетом регистра).
Элементу управления Button с помощью свойства Text задается значение «Cancel», а свойству CommandName задается значение cancel.
Кнопка Обновить позволяет пользователям указывать на завершение правки и сохранение любых изменений. Кнопка Отмена позволяет выйти из режима редактирования без сохранения изменений.
Напишите код для выполнения следующих задач:
Обработка события EditCommand элемента управления DataList, которое задает свойству EditItemIndex элемента управления DataList значение индекса элемента, который помещается в режим редактирования. Индекс выделенного пользователем элемента доступен через свойство ItemIndex объекта Item. Затем вызовите метод DataBind данного элемента управления.
Обработка события CancelCommand элемента управления DataList, которое задает свойству EditItemIndex элемента управления DataList значение -1 и затем вызывает метод DataBind данного элемента управления.
Обработка события UpdateCommand элемента управления DataList. В данном коде, чтобы обновить операцию, извлеките значения из элементов управления в текущем элементе и передайте эти значения элементу управления источником данных. Выбор используемого кода зависит от типа используемого элемента управления источником данных.
Пример
В следующем примере кода показана страница ASP.NET, на которой использованы элементы управления DataList и SqlDataSource для вывода сведений из таблицы Categories базы данных Northwind. Пользователь может править элементы.
Примечание о безопасности. |
---|
В данном примере имеется текстовое поле для ввода пользовательских данных, которые представляют потенциальную угрозу безопасности. По умолчанию на веб-страницах ASP.NET проверяются введенные пользователем данные на наличие сценариев и HTML-элементов. Дополнительные сведения см. в разделе Общие сведения об использовании сценариев. |
<%@ Page Language="VB" %>
<script runat="server">
Protected Sub DataList1_EditCommand(ByVal source As Object, _
ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
DataList1.EditItemIndex = e.Item.ItemIndex
DataList1.DataBind()
End Sub
Protected Sub DataList1_CancelCommand(ByVal source As Object, _
ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
DataList1.EditItemIndex = -1
DataList1.DataBind()
End Sub
Protected Sub DataList1_UpdateCommand(ByVal source As Object, _
ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
Dim categoryID As String = _
DataList1.DataKeys(e.Item.ItemIndex).ToString()
Dim categoryName As TextBox = _
CType(e.Item.FindControl("textCategoryName"), TextBox)
Dim description As TextBox = _
CType(e.Item.FindControl("textDescription"), TextBox)
SqlDataSource1.UpdateParameters("original_CategoryID"). _
DefaultValue = categoryID
SqlDataSource1.UpdateParameters("categoryName"). _
DefaultValue = categoryName.Text
SqlDataSource1.UpdateParameters("Description"). _
DefaultValue = description.Text
SqlDataSource1.Update()
DataList1.EditItemIndex = -1
DataList1.DataBind()
End Sub
</script>
<html>
<head runat="server"></head>
<body>
<form id="form1" runat="server">
<div>
<br />
<asp:DataList runat="server"
DataKeyField="CategoryID"
DataSourceID="SqlDataSource1" ID="DataList1"
OnEditCommand="DataList1_EditCommand"
OnCancelCommand="DataList1_CancelCommand"
OnUpdateCommand="DataList1_UpdateCommand">
<EditItemTemplate>
ID: <asp:Label ID="Label1" runat="server"
Text='<%# Eval("CategoryID") %>'>
</asp:Label>
<br />
Name: <asp:TextBox ID="textCategoryName" runat="server"
Text='<%# Eval("CategoryName") %>'>
</asp:TextBox>
<br />
Description: <asp:TextBox ID="textDescription"
runat="server"
Text='<%# Eval("Description") %>'>
</asp:TextBox>
<br />
<asp:LinkButton ID="LinkButton1" runat="server"
CommandName="update" >
Save
</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server">
CommandName="cancel"
Cancel
</asp:LinkButton>
</EditItemTemplate>
<ItemTemplate>
CategoryID:
<asp:Label ID="CategoryIDLabel" runat="server"
Text='<%# Eval("CategoryID") %>'>
</asp:Label>
<br />
CategoryName:
<asp:Label ID="CategoryNameLabel" runat="server"
Text='<%# Eval("CategoryName") %>'>
</asp:Label>
<br />
Description:
<asp:Label ID="DescriptionLabel" runat="server"
Text='<%# Eval("Description") %>'>
</asp:Label>
<br />
<asp:LinkButton runat="server" ID="LinkButton1"
CommandName="edit" >
Edit
</asp:LinkButton><br />
</ItemTemplate>
</asp:DataList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString=
"<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT [CategoryID], [CategoryName],
[Description] FROM [Categories]"
UpdateCommand="UPDATE [Categories] SET [CategoryName] =
@CategoryName, [Description] = @Description
WHERE [CategoryID] = @original_CategoryID">
<UpdateParameters>
<asp:Parameter Name="CategoryName" Type="String" />
<asp:Parameter Name="Description" Type="String" />
<asp:Parameter Name="original_CategoryID" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
<%@ Page Language="C#" %>
<script runat="server">
protected void DataList1_EditCommand(object source,
DataListCommandEventArgs e)
{
DataList1.EditItemIndex = e.Item.ItemIndex;
DataList1.DataBind();
}
protected void DataList1_CancelCommand(object source,
DataListCommandEventArgs e)
{
DataList1.EditItemIndex = -1;
DataList1.DataBind();
}
protected void DataList1_UpdateCommand(object source,
DataListCommandEventArgs e)
{
String categoryID =
DataList1.DataKeys[e.Item.ItemIndex].ToString();
String categoryName =
((TextBox)e.Item.FindControl("textCategoryName")).Text;
String description =
((TextBox) e.Item.FindControl("textDescription")).Text;
SqlDataSource1.UpdateParameters["original_CategoryID"].DefaultValue
= categoryID;
SqlDataSource1.UpdateParameters["categoryName"].DefaultValue
= categoryName;
SqlDataSource1.UpdateParameters["Description"].DefaultValue
= description;
SqlDataSource1.Update();
DataList1.EditItemIndex = -1;
DataList1.DataBind();
}
</script>
<html>
<head runat="server"></head>
<body>
<form id="form1" runat="server">
<div>
<br />
<asp:DataList runat="server"
DataKeyField="CategoryID"
DataSourceID="SqlDataSource1" ID="DataList1"
OnEditCommand="DataList1_EditCommand"
OnCancelCommand="DataList1_CancelCommand"
OnUpdateCommand="DataList1_UpdateCommand">
<EditItemTemplate>
ID: <asp:Label ID="Label1" runat="server"
Text='<%# Eval("CategoryID") %>'>
</asp:Label>
<br />
Name: <asp:TextBox ID="textCategoryName" runat="server"
Text='<%# Eval("CategoryName") %>'>
</asp:TextBox>
<br />
Description: <asp:TextBox ID="textDescription"
runat="server"
Text='<%# Eval("Description") %>'>
</asp:TextBox>
<br />
<asp:LinkButton ID="LinkButton1" runat="server"
CommandName="update" >
Save
</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server">
CommandName="cancel"
Cancel
</asp:LinkButton>
</EditItemTemplate>
<ItemTemplate>
CategoryID:
<asp:Label ID="CategoryIDLabel" runat="server"
Text='<%# Eval("CategoryID") %>'>
</asp:Label>
<br />
CategoryName:
<asp:Label ID="CategoryNameLabel" runat="server"
Text='<%# Eval("CategoryName") %>'>
</asp:Label>
<br />
Description:
<asp:Label ID="DescriptionLabel" runat="server"
Text='<%# Eval("Description") %>'>
</asp:Label>
<br />
<asp:LinkButton runat="server" ID="LinkButton1"
CommandName="edit" >
Edit
</asp:LinkButton><br />
</ItemTemplate>
</asp:DataList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString=
"<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT [CategoryID], [CategoryName],
[Description] FROM [Categories]"
UpdateCommand="UPDATE [Categories] SET [CategoryName] =
@CategoryName, [Description] = @Description
WHERE [CategoryID] = @original_CategoryID">
<UpdateParameters>
<asp:Parameter Name="CategoryName" Type="String" />
<asp:Parameter Name="Description" Type="String" />
<asp:Parameter Name="original_CategoryID" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
Чтобы обновить данные, необходим первичный ключ обновляемой записи. Можно возвратить это значение из свойства DataKeyField, которое содержит массив ключей.
Чтобы возвратить значение определенного элемента управления в данном элементе, используйте метод FindControl объекта аргументов события Item.
Значения, заданные в словаре SqlDataSource1.UpdateParameters, должны соответствовать именам, установленным в элементе UpdateParameters.
Компиляция кода
В коде должна быть строка подключения с именем NorthwindConnectionString. Предполагается, что база данных, к которой устанавливается подключение, должна иметь таблицу с именем Categories и полями CategoryID, CategoryName и Description.
Учетная запись, с которой происходит подключение страницы к базе данных, должна иметь разрешения на обновление таблицы Category.
Отказоустойчивость
Код в данном примере не выполняет следующие задачи, которые обычно выполняются в рабочей среде:
В коде не включена проверка ошибок, которая проводится, чтобы убедиться, что метод FindControl возвращает действительный элемент управления. Для большей надежности кода убедитесь, что значение, возвращаемое методом FindControl, не является нулевой ссылкой (Nothing в Visual Basic).
В коде не происходит проверка успешности окончания обновления.
Безопасность
Данные, вводимые пользователем на странице Web Forms, могут содержать потенциально небезопасный для клиента сценарий. По умолчанию на странице Web Forms проверяется ввод пользователя на наличие сценариев или элементов HTML. Дополнительные сведения см. в разделе Общие сведения об использовании сценариев.
См. также
Основные понятия
Изменение данных с помощью элемента управления SqlDataSource
Использование параметров с элементом управления SqlDataSource