Доступ к данным с помощью элементов управления источником данных (DataSource) в ASP.NET 2.0 - Отмена удаления
ОГЛАВЛЕНИЕ
Отмена удаления
Как уже обсуждалось, когда вызывается метод Delete() элемента управления источником данных, то выполняется следующая последовательность шагов:
- Выполняется метод Deleting источника данных
- Происходит действие удаления
- Выполняется метод Deleting источника данных
Давайте рассмотрим способ реализации отмены удаления из события 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.
