Практическое руководство. Предоставление пользователям разрешения на изменение элементов в серверном веб-элементе управления DataList

Visual Studio 2010

Обновлен: Ноябрь 2007

Можно разрешить пользователям править отдельные элементы в серверном веб-элементе управления DataList. Когда для отдельного элемента задается режим редактирования, значения, которые могут быть изменены, обычно отображаются в виде текстовых полей или других элементов управления, допускающих изменение значения пользователями.

Предоставление пользователям разрешения на редактирование элементов в элементе управления DataList

  1. Для элемента управления DataList задайте свойству DataKeyField значение имени поля, выраженное в данных, которые содержат первичный ключ.

  2. Создайте свойство ItemTemplate (а также, если необходимо, свойство AlternatingItemTemplate), затем добавьте в данное свойство серверный веб-элемент управления Button. Задайте свойству для данной кнопки CommandName значение edit.

    90xwe9s3.alert_note(ru-ru,VS.100).gifПримечание.

    Можно использовать элемент управления LinkButton или ImageButton для любого шага, на котором происходит вызов серверного веб-элемента управления Button.

  3. Создайте свойство EditItemTemplate для элемента управления DataList, содержащее следующие элементы:

    • Элементы управления для всех изменяемых значений. Например, для всех знаков и числовых данных включите элементы управления TextBox. Используйте декларативный метод Eval, чтобы указать, к какому полю привязан каждый элемент управления, как показано в следующем примере.

      90xwe9s3.alert_security(ru-ru,VS.100).gifПримечание о безопасности.

      В данном примере имеется текстовое поле для ввода пользовательских данных, которые представляют потенциальную угрозу безопасности. По умолчанию на веб-страницах ASP.NET проверяются введенные пользователем данные на наличие сценариев и HTML-элементов. Дополнительные сведения см. в разделе Общие сведения об использовании сценариев.

      <asp:TextBox ID="TextBox1" 
        runat="server" 
        Text='<%# Eval("ProductName") %>' />
      
    • Элементу управления Button с помощью свойства Text задается значение «Update», а свойству CommandName задается значение update (с учетом регистра).

    • Элементу управления Button с помощью свойства Text задается значение «Cancel», а свойству CommandName задается значение cancel.

      Кнопка Обновить позволяет пользователям указывать на завершение правки и сохранение любых изменений. Кнопка Отмена позволяет выйти из режима редактирования без сохранения изменений.

  4. Напишите код для выполнения следующих задач:

    • Обработка события EditCommand элемента управления DataList, которое задает свойству EditItemIndex элемента управления DataList значение индекса элемента, который помещается в режим редактирования. Индекс выделенного пользователем элемента доступен через свойство ItemIndex объекта Item. Затем вызовите метод DataBind данного элемента управления.

    • Обработка события CancelCommand элемента управления DataList, которое задает свойству EditItemIndex элемента управления DataList значение -1 и затем вызывает метод DataBind данного элемента управления.

    • Обработка события UpdateCommand элемента управления DataList. В данном коде, чтобы обновить операцию, извлеките значения из элементов управления в текущем элементе и передайте эти значения элементу управления источником данных. Выбор используемого кода зависит от типа используемого элемента управления источником данных.

В следующем примере кода показана страница ASP.NET, на которой использованы элементы управления DataList и SqlDataSource для вывода сведений из таблицы Categories базы данных Northwind. Пользователь может править элементы.

90xwe9s3.alert_security(ru-ru,VS.100).gifПримечание о безопасности.

В данном примере имеется текстовое поле для ввода пользовательских данных, которые представляют потенциальную угрозу безопасности. По умолчанию на веб-страницах ASP.NET проверяются введенные пользователем данные на наличие сценариев и 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>
                &nbsp;
                <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. Дополнительные сведения см. в разделе Общие сведения об использовании сценариев.

Показ: