none
gridview - como apagar uma linha ? RRS feed

  • Pergunta

  • Olá Pessoal, estou aqui tendo uns probleminhas pra fazer o comando Delete em uma GridView.

    Na verdade, de início, apanhei pra fazer a Grid, acabei optando por nao fazer com EntityDataSource, pq achei complexo demais pra fazer uma coisa simples(não manjo muito de List<>) , e nem o sqlDataSource, pois mostrava os IDs dos campos que eram PK ao invés dos nomes (aí descobri que precisava fazer uma join table e desencanei desse approach), então achei esse código abeixo, que funcionou muito bem pra mostrar os campos tudo bonitinho, consigo fazer o insert através de uns textboxes e ele já atualiza pois está em um UpdatePanel. Mas não consigo implementar o Delete de jeito nenhum, já tentei várias coisas, o negócio é que o comando Delete tem que passar o numero da PK (ItensdeOSID) pra eu apagar (aqui pode ser via Entidade, até prefiro), mas não estou achando o caminho das pedras..

     #region datasource para o grid Itens de OS
    
            using (IBFTEC10Entities11 ctx = new IBFTEC10Entities11())
                {
                    //Seleciono o objeto cliente e crio um novo tipo
                    //Observe que o tipo anônimo criado tem as propriedades
                    //com o mesmo nome do campodatafield do gridview
                    //e depois atribuo a lista ao data source do grid
                    int y = Convert.ToInt32(OSIDlabel.Text);
                    gvClientes.DataSource = (from c in ctx.ItensDeOS where c.OSID.Equals(y)
                                             select new
                                                        {                                                        
                                                            ItensDeOSID=c.ItensDeOSID,
                                                            Produto = c.Produto.Nome,
                                                            Problema = c.Problema.Descricao,
                                                            Lote = c.Lote,
                                                            Quantidade= c.Quantidade
                                                        }).ToList();
                    gvClientes.DataBind();
                    
                }
    
            #endregion


    <asp:GridView ID="gvClientes" runat="server" AutoGenerateColumns="False" 
                                    CellPadding="4" ForeColor="#333333" GridLines="None" Width="780px" 
                                    >
                                    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                                    <Columns>
                                        <asp:BoundField DataField="ItensDeOSID" HeaderText="ItensDeOSID" />
                                        <asp:BoundField DataField="Produto" HeaderText="Produto" />
                                        <asp:BoundField DataField="Problema" HeaderText="Problema" />
                                        <asp:BoundField DataField="Lote" HeaderText="Lote" />
                                        <asp:BoundField DataField="Quantidade" HeaderText="Quantidade" />
                                        <asp:TemplateField>
      <ItemTemplate>
        <asp:LinkButton id="DeleteButton" runat="server" text="Excluir"
          CommandName="Delete" OnClientClick="return confirm('Tem certeza que deseja excluir esse item?');" OnDeleteCommand="Grid_Delete"></asp:LinkButton>
      </ItemTemplate>
    </asp:TemplateField>
                                    </Columns>
                                    <EditRowStyle BackColor="#999999" />
                                    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                                    <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                                    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                                    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                                    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                                    <SortedAscendingCellStyle BackColor="#E9E7E2" />
                                    <SortedAscendingHeaderStyle BackColor="#506C8C" />
                                    <SortedDescendingCellStyle BackColor="#FFFDF8" />
                                    <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
                                </asp:GridView>

    esse onDeleteCommand="Grid_Delete" eu fiz na mão, e então fiz um código com esse nome tentando pegar o ID da linha pelo e. mas nada acontece quando clica no excluir....

    Como eu disse, preciso só saber como fazer com que o botão Excluir daquela linha passe algum parametro que identifique a linha na tabela (de preferência pelo campo ItensDeOSID que é a chave) e suba um evento, já o código pra efetivamente excluir e atualizar a grid acho que consigo fazer..

    Grato desde já!

    Anderson

    Edit: consegui fazer usando SQLDataSource, ficou assim:

    <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
                                    ConnectionString="<%$ ConnectionStrings:IBFTEC10ConnectionString %>" 
                                    DeleteCommand="DELETE FROM ItensDeOS WHERE ItensDeOSID = @ItensDeOSID" 
                                    SelectCommand="SELECT Produto.Nome, Problema.Descricao, ItensDeOS.Lote, ItensDeOS.Quantidade, ItensDeOS.ItensDeOSID, ItensDeOS.OSID FROM ItensDeOS INNER JOIN Problema ON ItensDeOS.ProblemaID = Problema.ProblemaID INNER JOIN Produto ON ItensDeOS.ProdutoID = Produto.ProdutoID WHERE (ItensDeOS.OSID = @OSID)">
                                <SelectParameters>
                    <asp:ControlParameter ControlID="OSIDlabel" Name="OSID" 
                        PropertyName="Text" Type="Int32" />
                </SelectParameters>
                                
                                </asp:SqlDataSource>
                                <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                                    CellPadding="4" DataKeyNames="ItensDeOSID" datasourceid="SqlDataSource2" 
                                    ForeColor="#333333" GridLines="None" Width="780px">
                                    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                                    <Columns>
                                        <asp:BoundField DataField="Nome" HeaderText="Produto" SortExpression="Nome" >
                                        <HeaderStyle HorizontalAlign="Left" />
                                        </asp:BoundField>
                                        <asp:BoundField DataField="Descricao" HeaderText="Problema" 
                                            SortExpression="Descricao" >
                                        <HeaderStyle HorizontalAlign="Left" />
                                        </asp:BoundField>
                                        <asp:BoundField DataField="Lote" HeaderText="Lote" SortExpression="Lote" >
                                        <HeaderStyle HorizontalAlign="Left" />
                                        </asp:BoundField>
                                        <asp:BoundField DataField="Quantidade" HeaderText="Quantidade" 
                                            SortExpression="Quantidade" >
                                        <HeaderStyle HorizontalAlign="Left" />
                                        </asp:BoundField>
                                        <asp:CommandField DeleteText="Excluir" ShowDeleteButton="True" />
                                    </Columns>
                                    <EditRowStyle BackColor="#999999" />
                                    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                                    <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                                    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                                    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                                    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                                    <SortedAscendingCellStyle BackColor="#E9E7E2" />
                                    <SortedAscendingHeaderStyle BackColor="#506C8C" />
                                    <SortedDescendingCellStyle BackColor="#FFFDF8" />
                                    <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
                                </asp:GridView>


    sexta-feira, 14 de junho de 2013 16:42

Respostas

  • Anderson seguindo o exemplo que está utilizando você pode pegar o Id pelo commandArgument do LinkButton basta adicionar o commandArgument, ex:

      <ItemTemplate>
        <asp:LinkButton id="DeleteButton" runat="server" text="Excluir"
          CommandName="Delete" OnClientClick="return confirm('Tem certeza que deseja excluir esse item?');" 
                CommandArgument='<%# Eval("ItensDeOSID")%>' 
                OnDeleteCommand="Grid_Delete"></asp:LinkButton>
        </ItemTemplate>

    E em seguida no Evento ItemCommand do seu Grid realizar a exclusão e atualizar o grid. ex:

     //Evento ItemCommand do seu GridView
                protected void gvClientes_ItemCommand(object sender, ListViewCommandEventArgs e)
                {
                    //Verifica se o commandName é o de exclusão
                    if (e.CommandName == "Delete")
                    {
                        //recupera o id vindo pelo Argument
                        int idItensDeOSID = Convert.ToInt32(
                           e.CommandArgument);
                        using (IBFTEC10Entities11 ctx = new IBFTEC10Entities11())
                        {
                            //Recupera o objeto a ser excluido
                            var obj = ctx.ItensDeOS.FirstOrDefault(x=>x.ItensDeOSID == idItensDeOSID);
                            //Exclui
                            ctx.ItensDeOS.Delete(obj);
                            //Salva
                            ctx.SaveChanges();
                        }
                    }
                }

    Alguma coisa assim não testei e não estou com o VS! Mais a lógica é essa!


     "Feliz aquele que transfere o saber e aprende o que ensina."(Cora Coralina)


    Pablo Batista Cardoso
    www.pablobatistacardoso.com.br
    pablobatistacardoso@hotmail.com

    segunda-feira, 17 de junho de 2013 17:38

Todas as Respostas

  • Anderson o erro é que vc tem que pegar o ID da linha clicada vc pode fazer assim no evento gridview1_selectedIndexChanged vc coloca isso

    int linha;

    Grdiviewrow row = gridview1.selectedrow;(aqui vc sabe qual id da linha clicada é só passar isso no seu delete)


    Junior

    sexta-feira, 14 de junho de 2013 18:19
  • Obrigado Junior!

    Mas ao invés de pegar o id da linha na grid, nao teria como pegar o valor da coluna ItenDeOSID naquela linha? é pq ela é a PK que vou usar pra apagar a linha no BD usando o Entity Framework..

    sexta-feira, 14 de junho de 2013 20:47
  • Desculpa Anderson o código completo é esse esqueci de te passar todo

    int codigo;
    GridViewRow row = Gv_Funcionario.SelectedRow;
    codigo = Convert.ToInt32(row.Cells[1].Text);
    Com o Codigo pego o id da linha clicada ai vc pode passa-la via entity para excluir, eu não excluo registro apenas tenho uma coluna na tabela onde gravo a data da exclusão, mais uso tb entity.

    Junior

    segunda-feira, 17 de junho de 2013 11:56
  • Anderson seguindo o exemplo que está utilizando você pode pegar o Id pelo commandArgument do LinkButton basta adicionar o commandArgument, ex:

      <ItemTemplate>
        <asp:LinkButton id="DeleteButton" runat="server" text="Excluir"
          CommandName="Delete" OnClientClick="return confirm('Tem certeza que deseja excluir esse item?');" 
                CommandArgument='<%# Eval("ItensDeOSID")%>' 
                OnDeleteCommand="Grid_Delete"></asp:LinkButton>
        </ItemTemplate>

    E em seguida no Evento ItemCommand do seu Grid realizar a exclusão e atualizar o grid. ex:

     //Evento ItemCommand do seu GridView
                protected void gvClientes_ItemCommand(object sender, ListViewCommandEventArgs e)
                {
                    //Verifica se o commandName é o de exclusão
                    if (e.CommandName == "Delete")
                    {
                        //recupera o id vindo pelo Argument
                        int idItensDeOSID = Convert.ToInt32(
                           e.CommandArgument);
                        using (IBFTEC10Entities11 ctx = new IBFTEC10Entities11())
                        {
                            //Recupera o objeto a ser excluido
                            var obj = ctx.ItensDeOS.FirstOrDefault(x=>x.ItensDeOSID == idItensDeOSID);
                            //Exclui
                            ctx.ItensDeOS.Delete(obj);
                            //Salva
                            ctx.SaveChanges();
                        }
                    }
                }

    Alguma coisa assim não testei e não estou com o VS! Mais a lógica é essa!


     "Feliz aquele que transfere o saber e aprende o que ensina."(Cora Coralina)


    Pablo Batista Cardoso
    www.pablobatistacardoso.com.br
    pablobatistacardoso@hotmail.com

    segunda-feira, 17 de junho de 2013 17:38
  • Obrigado Pablo! Entendi a lógica, é exatamente dessa forma que quero fazer, mas deve ter alguma coisa, pois não está funcionando, a linha não está sendo apagada do db....

    ps. uma vez funcionando, na verdade, a idéia é este campo ItensDeOSID ficar oculto na tabela que é mostrada na tela, (quero apenas que apareça Problema, Produto, Lote, Quantidade) por isso acho que a idéia do Junior não vai se aplicar nesse caso.. estou certo?

    quarta-feira, 26 de junho de 2013 15:56
  • Acredito que você esteja certo, mais com a linha selecionada você pode recuperar o objeto inteiro do novo tipo que criou e passou para o grid e assim recuperar o Id, mais debuga o code que te mandei, pois o mesmo deve funcionar!

     "Feliz aquele que transfere o saber e aprende o que ensina."(Cora Coralina)


    Pablo Batista Cardoso
    www.pablobatistacardoso.com.br
    pablobatistacardoso@hotmail.com

    quarta-feira, 26 de junho de 2013 16:39
  • Olá Pablo muito obrigado! Bom, eu fiz um novo .aspx. só pra testar esse grid, e rodei com debug, ta dando esse erro aqui: 
    The GridView 'gvClientes' fired event RowDeleting which wasn't handled.

    Abaiso, os códigos, acho que agora só falta algum OnClick, ou alguma coisa na confirmação da mensagem pra disparar o evento, seria por aí mesmo?

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="teste.aspx.cs" Inherits="DynamicData_CustomPages_OS_teste" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
                                <asp:GridView ID="gvClientes" runat="server" AutoGenerateColumns="False" 
                                    CellPadding="4" ForeColor="#333333" 
            GridLines="None" Width="780px"  
                                    datakeynames="ItensDeOSID"
                                     >
                                    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                                    <Columns>
                                        <asp:BoundField DataField="ItensDeOSID" HeaderText="ItensDeOSID" />
                                        <asp:BoundField DataField="Produto" HeaderText="Produto" />
                                        <asp:BoundField DataField="Problema" HeaderText="Problema" />
                                        <asp:BoundField DataField="Lote" HeaderText="Lote" />
                                        <asp:BoundField DataField="Quantidade" HeaderText="Quantidade" />
                                        <asp:TemplateField>
      <ItemTemplate>
        <asp:LinkButton id="DeleteButton" runat="server" text="Excluir"
          CommandName="Delete" OnClientClick="return confirm('Tem certeza que deseja excluir esse item?');" 
                CommandArgument='<%# Eval("ItensDeOSID")%>' 
                OnDeleteCommand="Delete"></asp:LinkButton>
        </ItemTemplate>
    </asp:TemplateField>
                                       
                                    </Columns>
                                    <EditRowStyle BackColor="#999999" />
                                    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                                    <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                                    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                                    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                                    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                                    <SortedAscendingCellStyle BackColor="#E9E7E2" />
                                    <SortedAscendingHeaderStyle BackColor="#506C8C" />
                                    <SortedDescendingCellStyle BackColor="#FFFDF8" />
                                    <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
                                </asp:GridView>
        <div>
        
        </div>
        </form>
    </body>
    </html>
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using IBFTEC10Model;
    using System.Security.AccessControl;
    using System.IO;
    
    public partial class DynamicData_CustomPages_OS_teste : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            #region datasource para o grid Itens de OS
    
            using (IBFTEC10Entities11 ctx = new IBFTEC10Entities11())
            {
                //Seleciono o objeto cliente e crio um novo tipo
                //Observe que o tipo anônimo criado tem as propriedades
                //com o mesmo nome do campodatafield do gridview
                //e depois atribuo a lista ao data source do grid
                int y = 27;
                gvClientes.DataSource = (from c in ctx.ItensDeOS
                                         where c.OSID.Equals(y)
                                         select new
                                         {
                                             ItensDeOSID = c.ItensDeOSID,
                                             Produto = c.Produto.Nome,
                                             Problema = c.Problema.Descricao,
                                             Lote = c.Lote,
                                             Quantidade = c.Quantidade
                                         }).ToList();
    
    
    
                gvClientes.DataBind();
    
    
            }}
    
            #endregion
            //Evento ItemCommand do seu GridView
                protected void gvClientes_ItemCommand(object sender, ListViewCommandEventArgs e)
                {
                    //Verifica se o commandName é o de exclusão
                    if (e.CommandName == "Delete")
                    {
                        //recupera o id vindo pelo Argument
                        int idItensDeOSID = Convert.ToInt32(
                           e.CommandArgument);
                        using (IBFTEC10Entities11 ctx = new IBFTEC10Entities11())
                        {
                            //Recupera o objeto a ser excluido
                            var obj = ctx.ItensDeOS.FirstOrDefault(x=>x.ItensDeOSID == idItensDeOSID);
                            //Exclui
                            ctx.ItensDeOS.DeleteObject(obj);
                            //Salva
                            ctx.SaveChanges();
                        }
    
                    }
                }          
    
        }
    

    quarta-feira, 26 de junho de 2013 18:38