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

ОГЛАВЛЕНИЕ


Удаление при помощи элемента управления GridView

В ASP.NET 2.0 было представлено несколько новых элементов управления данными, к примеру, GridView, DetailsView, FormView и  др. Элемент управления GridView разработан для того, чтобы отображать информацию о множестве записей, а также он обладает функциональностью удаления, которую можно активировать, установив соответствующую галочку. Для того чтобы продемонстрировать данную функциональность, мы рассмотрим случай, когда GridView будет отображать все записи, и затем добавим колонку кнопок удаления к сетке.

Для начала, добавьте элемент управления SqlDataSource на страницу и затем используйте тот же DeleteCommand что и в предыдущем примере:

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

Далее добавьте параметр @ProductID к набору DeleteParameters элемента. Вместо того, чтобы использовать ControlParameter , как мы делали это в предыдущем примере, используйте стандартный объект Parameter.

<asp:SqlDataSource ID="ProductsDataSource" runat="server" ConnectionString="..."
   DeleteCommand="DELETE FROM [Products] WHERE [ProductID] = @ProductID"
   SelectCommand="SELECT [ProductID], [ProductName], [UnitPrice], [Discontinued] FROM [Products] ORDER BY [ProductName]">
   <DeleteParameters>
      <asp:Parameter Name="ProductID" Type="Int32" />
   </DeleteParameters>
</asp:SqlDataSource>

Заметьте: SelectCommand , который мы использовали в упомянутом SqlDataSource немного отличается от предыдущего примера тем, что он возвращает два дополнительных поля из таблицы Products: UnitPrice и Discontinued.

Далее, добавляем на страницу GridView и из его смарт-тега привязываем его к элементу SqlDataSource, который мы только что добавили (ProductsDataSource). При этом BoundFields автоматически добавляется к колонкам, возвращенным в SelectCommand. Он также устанавливает свойство DataKeys элемента GridView в колонки первичного ключа возвращенных данных - в данном случае ">ProductID".

Для того чтобы добавить колонку кнопок удаления (Delete), перейдите к смарт-тегу GridView и активируйте опцию удаления "Enable Deleting". Это добавляет CommandField к DetailsView и устанавливает его свойство ShowDeleteButton в True. CommandField при данной конфигурации отображает колонку, где для каждой строки есть кнопка удаления. Также активируйте опцию листания "Enable Paging", которая также расположена в смарт-теге GridView.

После того, как вы выполните все шаги, декларативная разметка вашего GridView должна быть похожа на следующую:

<asp:GridView ID="gvProducts" runat="server" AllowPaging="True"
      AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ProductsDataSource">
   <Columns>
      <asp:CommandField ShowDeleteButton="True" />
      <asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" />
      <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" SortExpression="UnitPrice" />
      <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" />
   </Columns>
</asp:GridView>

И это все! При нажатии кнопки Delete выполняются следующие действия:

  1. Выполняется постбэк
  2. Выполняется событие RowDeleting элемента GridView
  3. GridView заполняет @ProductID используя значение DataKeys для того кортежа, где была нажата кнопка удаления (Delete). (Свойство DataKeys должно быть установлено в "ProductID". Если вы очистите данное значение, или оно будет сброшено либо потеряно каким-то образом, то значение параметра @ProductID не будет присвоено при нажатии кнопки Delete. Следовательно, выражение DELETE не удалит ни одной записи! Поэтому, если вы тестируете GridView и узнаете, что кнопка Delete ничего не делает, то первым делом вам необходимо проверить правильно ли настроено свойство DataKeys элемента GridView.)
  4. GridView вызывает метод Delete() своего SqlDataSource
  5. Выполняется событие RowDeleted элемента GridView

Данный пример демонстрирует только простые возможности GridView и не включает в себя некоторые возможности, такие как предоставление окна сообщений для подтверждения удаления.