Excluindo linhas em um DataGrid


Vamos ver como podemos excluir  linhas de um controle DataGrid vinculado a uma fonte de dados. Para isto eu vou acessar o banco de dados Access - Northwind.mdb -  e exibir os dados da tabela Produtos . Vou exibir os campos código do Produto e o nome do Produto.

Depois de exibir os dados eu vou permitir que o usuário clique em uma linha para excluí-la do datagrid e da fonte de dados. Vamos ver como se faz ?

Para relembrar os conceitos sobre o controle DataGrid veja os artigos :

  1. ASP.NET - Exibindo e editando dados em DataGrid.
  2. ASP.NET - Paginando dados em um DataGrid

Vamos criar então uma página ASP.NET para fazer o acesso a tabela e exibir os dados.  Abaixo temos o código que faz basicamente o seguinte:

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>


<html>
<head>
<meta name="GENERATOR" Content="ASP Express 2.1">
<title>Excluindo linhas de um DataGrid vinculado a dados</title>

<script language="VB" runat="server">

Sub Page_Load(Source As Object, E As EventArgs)
   If Not Page.IsPostBack Then
       BindData()
   End If
End Sub

Sub BindData()
     Dim strConn as String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\inetpub\wwwroot\dados\Northwind.mdb"
     Dim MySQL as string = "SELECT CódigoDoProduto, NomeDoProduto, PreçoUnitário FROM produtos Where CódigoDoProduto < 50"
     Dim MyConn as New OleDbConnection(strConn)
     Dim ds as DataSet=New DataSet()
     Dim Cmd as New OleDbDataAdapter(MySQL,MyConn)

     Cmd.Fill(ds,"produtos")

    'exibe uma visão customizada da tabela produtos inserida no dataset
     MyDataGrid.Datasource=ds.Tables("produtos").DefaultView
     MyDataGrid.DataBind()

End Sub

Vejamos a seguir a definição do DataGrid:

<form runat="server" method="post">

<asp:label id="lblResults" Font-Bold="True" runat="server"
Font-Italic="True" ForeColor="#aa0000" />
<p>
<asp:Datagrid runat="server"
Id="MyDataGrid"
GridLines="Both"
cellpadding="0"
cellspacing="0"
Headerstyle-BackColor="#fffccc"
Headerstyle-Font-Name="Arial"
Headerstyle-Font-Bold="True"
Headerstyle-Font-Size="14"
BackColor="#8080FF"
Font-Name="Arial"
Font-Size="11"
AlternatingItemStyle-BackColor="#dcdedc"
AlternatingItemStyle-Font-Name="Arial"
AlternatingItemStyle-Font-Size="11"
BorderColor="Black"
AllowPaging = "True"
PageSize = "15"
PagerStyle-Mode = "NumericPages"
PagerStyle-HorizontalAlign="Center"
PagerStyle-PageButtonCount = "15"
OnPageIndexChanged = "Page_Change"
AutogenerateColumns="False"
  OnDeleteCommand="MyDataGrid_DeleteCommand"
  OnItemDataBound="MyDataGrid_ItemDataBound"

  DataKeyField="CódigoDoProduto"
Width="50%">
<Columns>
  <asp:ButtonColumn Text="Excluir" HeaderText="Excluir" CommandName="Delete"></asp:ButtonColumn>
  <asp:BoundColumn DataField="CódigoDoProduto" HeaderText="Codigo"></asp:BoundColumn>
  <asp:BoundColumn DataField="NomeDoProduto" HeaderText="Produto"></asp:BoundColumn>

</Columns>
</asp:DataGrid>
</form>
 

Como vamos querer excluir linhas do DataGrid temos que criar uma coluna do tipo - ButtonColumn - que dispara o evento DeleteCommand - e definir a propriedade CommandName do ButtonColumn para "Delete". A linha usada para isto foi a seguinte:

  <asp:ButtonColumn Text="Excluir" HeaderText="Excluir" CommandName="Delete"></asp:ButtonColumn>

Você terá que definir também o evento associado a  OnDeleteComand , no nosso caso : "MyDataGrid_DeleteCommand"

Terá que definir também o evento associado a   OnItemDataBound no nosso caso : "MyDataGrid_ItemDataBound"

Cada vez que a coluna ButtonColumn é clicada a página realiza um postback e o evento itemCommand é disparado.

Feito isto temos que criar o código associado aos eventos : "MyDataGrid_DeleteCommand" e MyDataGrid_ItemDataBound"

No evento  "MyDataGrid_DeleteCommand"  vou colocar o código que realiza a exclusão da linha da tabela produtos . O código ficou assim :

Sub MyDataGrid_DeleteCommand(s As Object, e As DataGridCommandEventArgs )

Dim strConn as String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\inetpub\wwwroot\dados\Northwind.mdb"
Dim DeleteCmd As String = "DELETE from produtos Where CódigoDoProduto = @CodigoDoProduto"
Dim MyConn as New OledBConnection(strConn)

Dim Cmd as New oLEdbCommand(DeleteCmd, MyConn)
Cmd.Parameters.Add(New OleDbParameter("@CodigoDoProduto", MyDataGrid.DataKeys(CInt(e.Item.ItemIndex))))

MyConn.Open()
Cmd.ExecuteNonQuery()
MyConn.Close()
BindData

End Sub

Neste código eu estou fazendo uma conexão com o banco de dados , definindo a string SQL para excluir os registro usando o parâmetro recebido quando o usuário clicar na coluna referente ao código que deseja excluir.

Para dar uma incrementada eu vou incluir um código javascript que solicita a confirmação do usuário para excluir o registro. O código deve ser posto no evento MyDataGrid_ItemDataBound" e fica assim :

Sub MyDataGrid_ItemDataBound(sender as Object, e as DataGridItemEventArgs)

' Verificamos se não é uma linha de cabacelho ou rodapéFirst
If e.Item.ItemType <> ListItemType.Header AND e.Item.ItemType <> ListItemType.Footer then

'Referencie o controle LinkButton
Dim deleteButton as LinkButton = e.Item.Cells(0).Controls(0)

'incluimos o gerenciador de evento onclick
deleteButton.Attributes("onclick") = "javascript:return " & _
"confirm('Tem certeza que deseja excluir o produto de código #" & DataBinder.Eval(e.Item.DataItem, "CódigoDoProduto") & "?')"
End If

End Sub

 

Para determinar o valor da chave primária relacionada a do datagrid usamos a propriedade DataFieldKey que pode ser usada para definir o valor da chave primária relacionada ao dado exibido no datagrid. Então usamos :   DataKeyField="CódigoDoProduto"

Após esta definição a propriedade DataKeys é preenchida com os valores do código para cada linha do DataGrid e pode ser acessada no evento DeleteCommand para obter o item apropriado , que é o index . ( MyDataGrid.DataKeys(CInt(e.Item.ItemIndex)

Executando a aplicação e clicando em um link Excluir devemos obter a página :


 

Eu poderia colocar este código on-line mas tenho certeza que minha tabela Produtos será detonada em pouco tempo.

Pegue o código da página aqui : deletaLinhaGrid.zip

Até breve...


José Carlos Macoratti