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 :
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 |
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