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

ОГЛАВЛЕНИЕ


Удаление данных вручную

Примеры, доступные в конце данной статьи, демонстрируют различные техники удаления данных из таблицы Products базы данных Northwind. Представьте, что нам необходимо создать страницу, которая позволяла бы пользователям удалять записи из таблицы Products посредством нажатия кнопки Delete. Мы смогли создать простую форму, которая включает в себя DropDownList и элемент Button.

В дополнение к данным элементам управления пользовательского ввода мы также можем добавить элемент управления SqlDataSource для обработки удаления. Этого можно достич при помощи двух элементов управления SqlDataSource - одного для выбора и второго для удаления - либо использовать один элемент управления для обоих случаев. Я использовал один элемент управления.

Предыдущие статьи данной серии исследовали возврат и привязку данных к элементу управления, поэтому мы не рассмотрим шаги привязки списка товаров к DropDownList. Как только вы настроите элемент SqlDataSource на то, чтобы он возвращал записи из таблицы Products и связал их с DropDownList, вы можете настроить свойства SqlDataSource, связанные с удалением, путем выбора элемента управления SqlDataSource в Designer и выбрав DeleteQuery в окне свойств (Properties). Тем самым вы вызовите диалоговое окно, где вы можете ввести свойство DeleteCommand элемента SqlDataSource и указать значения для DeleteParameters.

Поскольку мы хотим удалить конкретную запись из таблицы Products, установите свойство DeleteCommand в следующее выражение DELETE:

DELETE FROM [Products] WHERE [ProductID] = @ProductID 

Заметьте, что мы использовали параметр в выражении WHERE. Источником для значения данного параметра будет выбранное значение ProductID в элементе DropDownList. Вам необходимо сопоставить значения параметров со значением свойства SelectedValue в DropDownList посредством набора DeleteParameters используя ControlParameter. Легче всего сделать это из диалогового окна, вызванного нажатием на свойство DeleteQuery элемента SqlDataSource (смотрите следующее изображение).


В качестве альтернативы данные параметры могут быть указаны посредством декларативного синтаксиса элемента управления SqlDataSource:

<asp:SqlDataSource ID="ProductsDataSourceForDropDownList" runat="server" ConnectionString="..." 
   DeleteCommand="DELETE FROM [Products] WHERE [ProductID] = @ProductID"
   SelectCommand="SELECT [ProductID], [ProductName] FROM [Products] ORDER BY [ProductName]">
   <DeleteParameters>
      <asp:ControlParameter ControlID="ProductList" Name="ProductID" PropertyName="SelectedValue"
         Type="Int32" />
   </DeleteParameters>
</asp:SqlDataSource>

Заметьте, что указанная декларативная разметка содержит как и настройки свойств относительно удаления (DeleteCommand и DeleteParameters), так и свойство SelectCommand.

В любом событии, как только элементы управления будут добавлены на страницу InsertCommand и InsertParameters элемента SqlDataSource будут правильно настроены, удаление записи можно будет выполнить настолько же просто, как  и вызов метода Delete() элемента управления источником данных. Вдобавок к удалению товара нам также необходимо заново осуществить привязку данных к DropDownList (поэтому запись больше не будет нигде фигурировать). Также мы отобразим сообщение, подтверждающее удаление. Это можно выполнить используя обработчик события Click для кнопки "Delete Product".

Protected Sub btnDeleteProduct_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDeleteProduct.Click
   'Программно вызываем метод Delete
   ProductsDataSourceForDropDownList.Delete()

   'Отображаем подтверждающее сообщение
   Dim productJustDeleted As String = ProductList.SelectedItem.Text
   ClientScript.RegisterStartupScript(Me.GetType(), "Message", String.Format("alert('Товар {0} был удален...');", productJustDeleted.Replace("'", "\'")), True)

   'Заново привязываем данные к DropDownList, поэтому только что удаленный товар больше не появится в списках
   ProductList.DataBind()
End Sub