O controle GridView disponibiliza também a exclusão de registros dos registros que estão sendo exibidos nele de forma bem simples. Vale lembrar que neste caso, se o controle GridView estiver ligado à algum objeto de DataSource a exclusão já será refletida diretamente em seu repositório.
Nesta seção vamos analisar como efetuar a exclusão de dados utilizando os dois objetos que utilizamos no decorrer deste artigo: SqlDataSource e o ObjectDataSource.
Utilizando o objeto SqlDataSource
Assim como já vimos anteriormente, temos que definir a propriedade SelectCommand através da Smart Tag que irá retornar os dados à serem apresentados no controle GridView. Nesta mesma seção já definimos a propriedade DeleteCommand com o código T-SQL responsável pela exclusão. Para automatizar clique no botão Advanced… e marque a opção “Generate INSERT, UPDATE and DELETE statements“, assim como é mostrado na imagem abaixo:
|
|
| Figura 1 – Definindo a propriedade DeleteCommand. |
Depois da propriedade DeleteCommand definida temos, neste momento, que incluir no controle GridView a coluna responsável pela exclusão do registro, ou seja, a inclusão de uma coluna com LinkButtons que executará este processo. A imagem abaixo exibe a inclusão de uma coluna do tipo CommandField para Delete.
|
|
| Figura 2 – Incluindo a coluna do tipo CommandField no controle GridView. |
Depois destas configurações efetuadas o código HTML da página ASPX resultante é exibido abaixo:
<asp:SqlDataSource
ID="SqlDataSource1"
runat="server"
ConnectionString="<%$ ConnectionStrings:ConnString %>"
SelectCommand="SELECT UsuarioID, Nome, Email FROM Usuario"
DeleteCommand="DELETE FROM Usuario WHERE UsuarioID = @original_UsuarioID">
</asp:SqlDataSource>
<asp:GridView
ID="GridView1"
runat="server"
AutoGenerateColumns="False"
DataKeyNames="UsuarioID"
DataSourceID="SqlDataSource1">
<Columns>
<asp:CommandField ShowDeleteButton="True" />
<asp:BoundField
DataField="Nome"
HeaderText="Nome" />
<asp:BoundField
DataField="UsuarioID"
HeaderText="UsuarioID"
ReadOnly="True" />
</Columns>
</asp:GridView>
|
Analisando o código acima definimos a query de Delete na propriedade DeleteCommand e assim quando o usuário clicar no botão de exclusão este código T-SQL será executado. Em tempo de execução o ASP.NET define o valor do parâmetro da exclusão “@original_UsuarioID” através das DataKeys (as quais falaremos mais adiante), que neste caso é utilizado a coluna UsuarioID para identificação do registro/linha.
Depois destes passos, o controle GridView é exibido no browser da seguinte forma:
|
|
| Figura 3 – O controle GridView com a coluna de exclusão definida. |
Habilitando a confirmação antes da exclusão
Muitas vezes, antes de efetuarmos definitivamente a exclusão na base de dados, queremos certificar de que o usuário realmente tem certeza de que deseja fazer isso. A solução mais comum neste caso é utilizar Javascript para exibir um aviso questionando o usuário; se ele confirmar, a exclusão é realizada, caso contrário nada acontece.
Primeiramente temos que converter a coluna Delete em Template (não abordaremos isso a fundo agora justamente porque teremos um capítulo específico para explicar esta funcionalidade) como é exibido na imagem abaixo:
|
|
| Figura 4 – Convertendo a coluna Delete em TemplateColumn. |
Para efetuar esta conversão temos apenas que clicar no link (que está marcado em vermelho) chamado “Convert this field into a TemplateField“. Depois desta conversão realizada temos que criar a função Javascript na página ASPX para ser invocada quando o usuário tentar excluir o registro. O código abaixo é a função Javascript que utilizaremos posteriormente:
function ConfirmaExclusao(){
return confirm('Deseja realmente excluir este registro?');
}
|
Em seguida temos apenas que vincular esta função Javascript ao controle LinkButton, que é responsável por disparar a rotina de exclusão. Devemos definir a propriedade OnClientClick deste controle com o nome da função Javascript e, para isso, a imagem abaixo exibi-nos como fazer para alcançar esta propriedade de um controle que está contido dentro de uma TemplateColumn do GridView:
|
|
| Figura 5 – Editando a TemplateColumn. |
Finalmente temos o código HTML da página ASPX gerado por todas essas configurações:
<asp:GridView
ID="GridView1"
runat="server"
AutoGenerateColumns="False"
DataKeyNames="UsuarioID"
DataSourceID="SqlDataSource1">
<Columns>
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:LinkButton
ID="LinkButton1"
runat="server"
CausesValidation="False"
CommandName="Delete"
Text="Delete"
OnClientClick="javascript:return ConfirmaExclusao();">
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField
DataField="Nome"
HeaderText="Nome" />
<asp:BoundField
DataField="UsuarioID"
HeaderText="UsuarioID"
ReadOnly="True" />
</Columns>
</asp:GridView>
|
Ao executar a aplicação, o resultado é mostrado como na imagem abaixo:
|
|
| Figura 6 – Confirmando a exclusão de um registro/linha. |
Utilizando o objeto ObjectDataSource
A utilização do objeto ObjectDataSource é bem semelhante ao que vimos anteriormente com o objeto SqlDataSource. Temos apenas que nos preocupar com a criação de um método na classe de negócios que será responsável pela exclusão do registro. Este método terá apenas um parâmetro que é o ID do registro/linha que queremos excluir. O código deste método é exibido abaixo:
public void Delete(int original_ID)
{
SqlConnection conn =
new SqlConnection(
WebConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
SqlCommand cmd =
new SqlCommand("DELETE FROM Usuario WHERE UsuarioID = @ID", conn);
cmd.Parameters.AddWithValue("@ID", original_ID);
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
finally
{
if (conn != null)
{
conn.Close();
}
}
}
|
Se compararmos este código com o código de atualização veremos que é bem semelhante, apenas mudando a query que é executada e a quantidade de parâmetros necessários. Depois deste método criado devemos definir a propriedade DeleteMethod do objeto ObjectDataSource com este método. O código HTML da página ASPX é exibido abaixo:
<asp:ObjectDataSource
ID="ObjectDataSource1"
runat="server"
DeleteMethod="Delete"
SelectMethod="ResgataUsuarios"
TypeName="Usuarios">
</asp:ObjectDataSource>
<asp:GridView
ID="GridView1"
runat="server"
AutoGenerateColumns="False"
DataSourceID="ObjectDataSource1"
DataKeyNames="ID">
<Columns>
<asp:CommandField ShowDeleteButton="True" />
<asp:BoundField DataField="ID" HeaderText="ID" />
<asp:BoundField DataField="Nome" HeaderText="Nome" />
</Columns>
</asp:GridView>
|
Com este código já é possível executar a exclusão de registros de uma determinada fonte de dados através de uma classe de regras de negócio. A única observação importante é que aqui também não vemos a seção DeleteParameters com o parâmetro necessário para a exclusão definido. Isso tem a ver com a propriedade DataKeys do controle GridView, a qual vamos abordar mais detalhadamente em capítulos posteriores.





