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.