Доступ к данным с помощью элементов управления источником данных (DataSource) в ASP.NET 2.0 - Отмена удаления

ОГЛАВЛЕНИЕ


Отмена удаления

Как уже обсуждалось, когда вызывается метод Delete() элемента управления источником данных, то выполняется следующая последовательность шагов:

  1. Выполняется метод Deleting источника данных
  2. Происходит действие удаления
  3. Выполняется метод Deleting источника данных
Заметьте, что до того, как произойдет действие удаления, выполняется событие Deleting. В определенных случаях нам понадобится отменить удаление после того, как был вызван метод Delete() элемента управления источником. К примеру, мы можем иметь такой GridView, который включал бы  в себя кнопку Delete для каждой строки, хотя могут существовать некоторые требования, которые препятствуют удалению записей. Такая бизнес-логика может быть выполнена двумя путями: сокрытие либо отключение кнопок удаления программным путем для тех записей, которые нельзя удалять, либо программно проверить данные правила во время нажатия кнопки удаления, и при необходимости отменить удаление. В идеале могут быть использованы обе техники.

Давайте рассмотрим способ реализации отмены удаления из события Deleting элемента SqlDataSource. Основываясь на предыдущем примере, который использовал GridView, мы обновим логику страницу таким образом, что товары, у которых UnitPrice больше чем $50.00, не могут быть удалены.  Для выполнения данной задачи нам необходимо добавить обработчик для события Deleting и определить цену записи, которую мы собираемся удалить. Все, что мы имеем в данном обработчике события, так это значения параметров - в данном случае, только значение ProductID. Следовательно, нам необходимо заново осуществить запрос к базе данных для того, чтобы определить значение UnitPrice товара. Как это продемонстрировано в следующем коде, для того, чтобы просто отменить удаление, необходимо установить свойство e.Cancel в True.

Protected Sub ProductsDataSource_Deleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs) Handles ProductsDataSource.Deleting
   'Определяем,  имеет ли удаляемый товар цену > $50
   Dim productID As Integer = Convert.ToInt32(e.Command.Parameters("@ProductID").Value)

   'Определяем цену единицы для товара, который пользователь хочет удалить ...
   'Существует несколько способов реализации - использовать элемент SqlDataSource, написать код запроса к базе данных ...
   'Давайте используем код доступа к базе данных
   Dim myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("NorthwindConnectionString").ConnectionString)
   Const strSql As String = "SELECT UnitPrice FROM Products WHERE ProductID = @ProductID"
   Dim myCommand As New SqlCommand(strSql, myConnection)
   myCommand.Parameters.AddWithValue("@ProductID", productID)

   myConnection.Open()
   Dim price As Object = myCommand.ExecuteScalar
   myConnection.Close()

   'Запретить удаление в случае, если цена не равна NULL и она больше $50
   If Not Convert.IsDBNull(price) AndAlso Convert.ToDecimal(price) > 50 Then
     e.Cancel = True   'Cancel the delete
     CannotDeleteMessage.Visible = True 'Отображаем сообщение с объяснением
   End If
End Sub

Заметьте, что данные примеры используют код ADO.NET для доступа к информации базы данных и выполнению запроса для определения UnitPrice товара, который мы собираемся удалить. Значение ProductID данного товара возвращается из набора Parameters объекта e.Command. (Данный код возвращения параметра специфичен для типа используемого элемента источника данных; другими словами, код, рассмотренный здесь, был бы другим при использовании элемента управления ObjectDataSource.) Если значение UnitPrice не является NULL и превышает $50.00, то в данном случае удаление отменяется и элемент управления Label (CannotDeleteMessage) отображает информацию о том, что пользователь не может удалить указанный товар из-за цены.

Следующее изображение демонстрирует то, что произойдет при попытке удалить "Carnarvon Tigers", товар, который стоит больше чем $50.00.