Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

xanburzum

Excluindo uma linha no GridView com confirmação em Javascript

Recommended Posts

Neste artigo veremos como excluir registros ou linhas do ASP.Net GridView com uma caixa de confirmação usando o evento CommandField e RowDeleting.

 

A classe CommandField é um campo especial usado por controles ligados a dados (como GridView e DetailsView ) para exibir botões de comando que executam excluir, editar, inserir, ou operações de seleção. Os botões de comando para executar essas operações podem ser mostrados ou ocultos usando as propriedades mostradas na tabela a seguir. Ela representa um campo especial que exibe botões de comando para executar selecionar, editar, inserir ou excluir operações em um controle ligado a dados.

 

O evento RowDeleting é gerado quando o botão Delete de uma linha é clicado, mas antes que o controle GridView exclui a linha. Isso nos permite fornecer um método de manipulação de eventos que executa uma rotina personalizada, como cancelar a operação de exclusão, sempre que esse evento ocorre.

 

Um objeto GridViewDeleteEventArgs é passado para o método de manipulação de eventos, que permite que você para determine o índice da linha atual e para indicar que a operação de exclusão deve ser cancelada. Para cancelar a operação de exclusão, defina a propriedade Cancel do objeto GridViewDeleteEventArgs como true. Você também pode manipular as chaves e coleções de valores, se necessário, antes dos valores serem passados para a fonte de dados.

 

O exemplo a seguir demonstra como usar o evento RowDeleting para cancelar a operação de exclusão. A página contém um controle GridView que exibe uma lista de nomes e endereços de clientes do banco de dados AdventureWorksLT. Quando o usuário clica no link Delete, o manipulador para o evento RowDeleting verifica o último nome da pessoa exibida na linha de que o usuário está tentando excluir. Se o último nome é " Xanburzum ", a operação de exclusão é cancelada, e uma mensagem de erro é exibida. Para qualquer outro nome a operação de exclusão é executada e a linha é excluída.

 

O manipulador de eventos usa a propriedade do objeto RowIndex GridViewDeleteEventArgs para encontrar a linha que o usuário está tentando eliminar. O exemplo examina o conteúdo da coleção Rows. Para quem não sabe trabalhar com esta coleção, abaixo um exemplo de como usar a coleção Rows para acessar a linha que está sendo editada em um controle GridView. Depois que a linha é atualizada, é exibida uma mensagem para indicar que a atualização foi bem sucedida.

 


<%@ Page language="VB" %>



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">



 Sub CustomersGridView_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs)



   ' Limpar a label da mensagem quando o usuário entra no modo de edição.

   If e.CommandName = "Edit" Then

     Message.Text = ""

   End If



 End Sub



 Sub CustomersGridView_RowUpdated(ByVal sender As Object, ByVal e As GridViewUpdatedEventArgs)



   ' A operação de atualização foi bem sucedida. Recupere a linha que está sendo editada.



   Dim index As Integer = CustomersGridView.EditIndex

   Dim row As GridViewRow = CustomersGridView.Rows(index)



   ' Notifica o usuário de que a atualização foi bem sucedida.



   Message.Text = "Registro atualizado " & row.Cells(1).Text + "."



 End Sub



 Sub CustomersGridView_RowCancelingEdit(ByVal sender As Object, ByVal e As GridViewCancelEditEventArgs)



   ' A operação de atualização foi cancelada. Mostrar a mensagem apropriada.



   Message.Text = " Operação de Atualização cancelada."



 End Sub



</script>



<html xmlns="http://www.w3.org/1999/xhtml" >

 <head runat="server">

   <title> Exemplo GridView Rows </title>

</head>

<body>

   <form id="form1" runat="server">



     <h3> Exemplo GridView Rows </h3>



     <asp:label id="Message"

       forecolor="Red"

       runat="server"/>



     <br/>   



     <!-- O controle GridView ajusta automaticamente as colunas -->

     <!-- especificada na propriedade DataKeyNames como somente leitura.    -->

     <!-- Sem controles de entrada, é processada por estas colunas no modo edit -->



     <asp:gridview id="CustomersGridView"

       allowpaging="true"

       datasourceid="CustomersSqlDataSource"

       autogeneratecolumns="true"

       autogenerateeditbutton="true"

       datakeynames="CustomerID"

       onrowcommand="CustomersGridView_RowCommand"

       onrowupdated="CustomersGridView_RowUpdated"

       onrowcancelingedit="CustomersGridView_RowCancelingEdit" 

       runat="server">

     </asp:gridview>



     <!-- Este exemplo usa o Microsoft SQL Server e conecta  -->

     <!— com o banco Northwind. Use uma Expressão para recuperar -->

     <!-- o valor seqüência de conexão do arquivo Web.config -->



     <asp:sqldatasource id="CustomersSqlDataSource" 

       selectcommand="Select [CustomerID], [CompanyName], [Address], [City], [PostalCode], [Country] From [Customers]"

       updatecommand="Update Customers SET CompanyName=@CompanyName, Address=@Address, City=@City, PostalCode=@PostalCode, Country=@Country WHERE (CustomerID = @CustomerID)"

       deletecommand="Delete from Customers where CustomerID = @CustomerID"

       connectionstring="<%$ ConnectionStrings:NorthWindConnectionString%>"

       runat="server">

     </asp:sqldatasource>



   </form>

 </body>

</html>

 

Bom, visto como acessar a coleção Rows na linha que está sendo editada, atualizada e exibida uma mensagem para indicar que a atualização foi bem sucedida. Se o valor que você deseja comparar é um key value, você pode examinar a coleção DataKeys.

 

Voltando para nosso evento RowDeleting, as linhas são excluídas da tabela CustomerAddress em vez da tabela de clientes, a fim de manter o exemplo simples. O controle GridView mostra o resultado da reunião de três tabelas: Customer, Address e CustomerAddress. Quando uma linha CustomerAddress é excluída, a linha GridView correspondente desaparece. Restrições de integridade referencial faria o código para um exemplo que na verdade exclui linhas da tabela Customer mais complexa.

 


<%@ Page Language="VB" %>



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">



<script runat="server">



   Private Sub CustomersGridView_RowDeleting _

       (ByVal sender As [Object], _

       ByVal e As GridViewDeleteEventArgs)

       Dim cell As TableCell

       cell = CustomersGridView.Rows(e.RowIndex).Cells(2)

       If cell.Text = "Xanburzum" Then

           e.Cancel = True

           Message.Text = "Você não pode excluir o cliente Xanburzum."

       Else

           Message.Text = ""

       End If

   End Sub



</script>



<html xmlns="http://www.w3.org/1999/xhtml">

<head id="Head1" runat="server">

   <title>Exemplo de RowDeleting</title>

</head>

<body>

   <form id="form1" runat="server">

   <h3>

       Exemplo de RowDeleting

   </h3>

   <asp:Label ID="Message" ForeColor="Red" runat="server" />

   <br />

   <asp:GridView ID="CustomersGridView" runat="server" 

       DataSourceID="CustomersSqlDataSource" 

       AutoGenerateColumns="False"

       AutoGenerateDeleteButton="True" 

       OnRowDeleting="CustomersGridView_RowDeleting"

       DataKeyNames="CustomerID,AddressID">

       <Columns>

           <asp:BoundField DataField="FirstName" 

               HeaderText="FirstName" SortExpression="FirstName" />

           <asp:BoundField DataField="LastName" HeaderText="LastName" 

               SortExpression="LastName" />

           <asp:BoundField DataField="City" HeaderText="City" 

               SortExpression="City" />

           <asp:BoundField DataField="StateProvince" HeaderText="State" 

               SortExpression="StateProvince" />

       </Columns>

   </asp:GridView>

   <asp:SqlDataSource ID="CustomersSqlDataSource" runat="server"

       SelectCommand="SELECT SalesLT.CustomerAddress.CustomerID, 

           SalesLT.CustomerAddress.AddressID, 

           SalesLT.Customer.FirstName, 

           SalesLT.Customer.LastName, 

           SalesLT.Address.City, 

           SalesLT.Address.StateProvince 

           FROM SalesLT.Customer 

           INNER JOIN SalesLT.CustomerAddress 

           ON SalesLT.Customer.CustomerID = 

               SalesLT.CustomerAddress.CustomerID 

           INNER JOIN SalesLT.Address ON SalesLT.CustomerAddress.AddressID = 

               SalesLT.Address.AddressID"

       DeleteCommand="Delete from SalesLT.CustomerAddress where CustomerID = 

           @CustomerID and AddressID = @AddressID" 

       ConnectionString="<%$ ConnectionStrings:AdventureWorksLTConnectionString %>">

       <DeleteParameters>

           <asp:Parameter Name="AddressID" />

           <asp:Parameter Name="CustomerID" />

       </DeleteParameters>

   </asp:SqlDataSource>

   </form>

</body>

</html>

 

Depois desta boa explicação, vamos ao que interessa. Abaixo está o HTML do GridView. Estamos fazendo uso do evento CommandField e OnRowDeleting para excluir a linha no GridView. Em seguida vamos aplicar a caixa de confirmação JavaScript para o Botão CommandFieldDelete.

 

Código HTML

 

 

 

<asp:GridView ID="GridView1" CssClass = "Grid" runat="server" OnRowDeleting="OnRowDeleting" AutoGenerateColumns = "false" OnRowDataBound = "OnRowDataBound">

   <Columns>

       <asp:BoundField DataField="Item" HeaderText="Item" />

       <asp:BoundField DataField="Price" HeaderText="Price" />

       <asp:CommandField ShowDeleteButton="True" ButtonType="Button" />

   </Columns>

</asp:GridView>

 

 

 

Vinculando o GridView

 

Neste exemplo, eu estou vinculando o GridView com dados fictícios usando DataTable.

 

C#

 

protected void Page_Load(object sender, EventArgs e)

{

   if (!Page.IsPostBack)

   {

       DataTable dt = new DataTable();

       dt.Columns.AddRange(new DataColumn[2] { new DataColumn("Item"), new DataColumn("Price") });

       dt.Rows.Add("Camisa", 450);

       dt.Rows.Add("Jeans", 3200);

       dt.Rows.Add("Calça", 1900);

       dt.Rows.Add("Meia", 185);

       dt.Rows.Add("Chapéu", 100);

       dt.Rows.Add("Blusa", 120);

       dt.Rows.Add("Shorts", 290);

       dt.Rows.Add("Cinto", 150);

       ViewState["dt"] = dt;

       BindGrid();

   }

}



protected void BindGrid()

{

   GridView1.DataSource = ViewState["dt"] as DataTable;

   GridView1.DataBind();

}

 

 

 

VB.Net

 

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

   If Not Page.IsPostBack Then

       Dim dt As New DataTable()

       dt.Columns.AddRange(New DataColumn(1) {New DataColumn("Item"), New DataColumn("Price")})

       dt.Rows.Add("Camisa", 450)

       dt.Rows.Add("Jeans", 3200)

       dt.Rows.Add("Calça", 1900)

       dt.Rows.Add("Meia", 185)

       dt.Rows.Add("Chapéu", 100)

       dt.Rows.Add("Blusa", 120)

       dt.Rows.Add("Shorts", 290)

       dt.Rows.Add("Cinto", 150)

       ViewState("dt") = dt

       BindGrid()

   End If

End Sub



Protected Sub BindGrid()

   GridView1.DataSource = TryCast(ViewState("dt"), DataTable)

   GridView1.DataBind()

End Sub

 

 

 

Agora vamos, aplicar acaixa de confirmação em JavaScript para o botão Excluir do CommandField GridView. Para aplicar a caixa de confirmação JavaScript, vamor procurar o botão nos controles do GridView Cell Index 2, uma vez que tem o CommandField.

 

C#

 

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)

{

   if (e.Row.RowType == DataControlRowType.DataRow)

   {

       string item = e.Row.Cells[0].Text;

       foreach (Button button in e.Row.Cells[2].Controls.OfType<Button>())

       {

           if (button.CommandName == "Delete")

           {

               button.Attributes["onclick"] = "if(!confirm('Você quer excluir " + item + "?')){ return false; };";

           }

       }

   }

}

 

 

 

VB.Net

 

Protected Sub OnRowDataBound(sender As Object, e As GridViewRowEventArgs)

   If e.Row.RowType = DataControlRowType.DataRow Then

       Dim item As String = e.Row.Cells(0).Text

       For Each button As Button In e.Row.Cells(2).Controls.OfType(Of Button)()

           If button.CommandName = "Delete" Then

               button.Attributes("onclick") = "if(!confirm('Você quer excluir " + item + "?')){ return false; };"

           End If

       Next

   End If

End Sub

 

 

 

Estamos quase lá, e vamos excluir o ASP.Net GridView Row usando o evento CommandField e OnRowDeleting, abaixo está o código para excluir o ASP.Net GridView Row usando o evento OnRowDeleting.

 

C#

 

protected void OnRowDeleting(object sender, GridViewDeleteEventArgs e)

{

   int index = Convert.ToInt32(e.RowIndex);

   DataTable dt = ViewState["dt"] as DataTable;

   dt.Rows[index].Delete();

   ViewState["dt"] = dt;

   BindGrid();

}

 

 

 

VB.Net

 

Protected Sub OnRowDeleting(sender As Object, e As GridViewDeleteEventArgs)

   Dim index As Integer = Convert.ToInt32(e.RowIndex)

   Dim dt As DataTable = TryCast(ViewState("dt"), DataTable)

   dt.Rows(index).Delete()

   ViewState("dt") = dt

   BindGrid()

End Sub

 

E o resultado no browser é:

 

gridview_exclus%C3%A3obox1.jpg

 

Clicando no botão excluir, você receberá a seguinte mensagem:

 

gridview_exclus%C3%A3obox2.jpg

 

E aqui com o item excluído:

 

gridview_exclus%C3%A3obox3.jpg

 

Você pode fazer o download dos arquivos usados neste artigo clicando no link abaixo:

 

Download

 

Até mais e boa programação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa contribuição

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.