NUNCA MAIS PASSE RAIVA POR NÃO CONSEGUIR RESOLVER UM PROBLEMA COM O EXCEL - GARANTIDO!

UNIVERSIDADE DO VBA - Domine o VBA no Excel Criando Sistemas Completos - Passo a Passo - CLIQUE AQUI

Você está em: PrincipalArtigosASP.NET › Capítulo 15 : 03
Quer receber novidades e e-books gratuitos?
« Lição anterior Δ Página principal ¤ Capítulos Próxima lição »
ASP.NET - CURSO COMPLETO
Autor: Júlio Battisti
Lição 122 - Capítulo 15 - Edição de dados com o controle DataGrid

Nos exemplos dos capítulos anteriores, utilizamos o controle DataGrid para exibir dados em uma página ASP.NET. Também podemos utilizar o controle DataGrid para fazer a edição dos dados. No exemplo que apresentaremos neste tópico, utilizaremos um controle DataGrid que acessa dados da tabela authors, do banco de dados pubs do SQL Server 2000. Veremos como permitir que os dados sejam editados e que estas edições sejam enviadas de volta para o banco de dados.

Na Listagem 15.2 temos o código para o exemplo proposto. Após a listagem apresentaremos mais alguns comentários.

Listagem 15.2 – Edição de dados como DataGrid.

<%@ Page Language="C#" Debug="true"  %>
   <%@ Import Namespace="System.Data"  %>
   <%@ Import  Namespace="System.Data.SqlClient" %>
    
   <html>
<script language="C#"  runat="server">
    
    void BuscaDados() 
      {
      
               //  Crio uma conexão com o banco de dados pubs localizado no servidor local.
               // Vamos acessar a instância  SERVIDOR\NETSDK.
               
                SqlConnection myConnection = new  SqlConnection("server=SERVIDOR\\NETSDK;" +
                        "  uid=sa;pwd=;database=pubs");
               
               // Conectamos com o banco de  dados utilizando um comando SQL,
               // o qual retorna todos os dados da  tabela "Authors", do banco de 
               //  dados pubs.  
               
               SqlDataAdapter  myCommand = new SqlDataAdapter("SELECT " +
                  " au_id,au_fname,au_lname,phone FROM  Authors Order By au_fname", myConnection);
               
               // Criamos e preenchemos um  objeto DataSet.
               
               DataSet ds = new DataSet();
               myCommand.Fill(ds);
               
               // Conectamos um controle  DataGrid com o DataSet criado anteriormente. 
               // MyDataGrid é o id (nome) de um  controle do tipo
               // DataGrid que está na seção de  apresentação da página.
               
               DataView  source = new DataView(ds.Tables[0]);
               MinhaGrade.DataSource  = source ;
               MinhaGrade.DataBind();
   }
                   void Page_Load(Object sender, EventArgs e) 
         {
               if (!Page.IsPostBack)
               {
                txtTitulo.Text="Clique em Editar para  alterar os dados de uma linha!";
                BuscaDados();
               }
         }
    
                   void  FazEdicao(Object sender, DataGridCommandEventArgs e) 
            {
               txtTitulo.Text="Clique em  Atualizar para Confirmar as alterações!";
               txtTitulo2.Text="ou Clique em  Cancelar para descartar as alterações!";
               MinhaGrade.EditItemIndex =  e.Item.ItemIndex;
               BuscaDados();
            }
    
                   void  CancelaAlteracoes(Object sender, DataGridCommandEventArgs e) 
            {
               txtTitulo.Text="Clique  em Editar para alterar os dados de uma linha!";            
               txtTitulo2.Text="";
               MinhaGrade.EditItemIndex = -1;
               BuscaDados();
            }
    
                   void FazUpdate(Object sender,  DataGridCommandEventArgs e) 
      {
                           //  Crio uma conexão com o banco de dados pubs localizado no servidor local.
               //  Vamos acessar a instância SERVIDOR\NETSDK.
                            
               SqlConnection  myConnection = new SqlConnection("server=SERVIDOR\\NETSDK;" +
                                    "  uid=sa;pwd=;database=pubs");
                           
               // Conectamos com o banco de  dados utilizando um comando SQL,
               // o qual retorna todos os dados da  tabela "Authors", do banco de 
               //  dados pubs.  
                           
               SqlDataAdapter  MeuDataAdapter = new SqlDataAdapter("SELECT " +
                  " au_id,au_fname,au_lname,phone FROM  Authors Order By au_fname", myConnection);
                           
                // Criamos e preenchemos um objeto DataSet.
                                       
               DataSet  ds = new DataSet();
               MeuDataAdapter.Fill(ds,"authors");
                           
               DataView source = new  DataView(ds.Tables[0]);
                   
                DataTable authors = ds.Tables[0];
                                       
               // Vamos definir o campo  au_id como sendo a chave
               // primária da tabela Autores.
                                              
               authors.PrimaryKey  = new DataColumn[] {authors.Columns["au_id"]};
                                       
               // Atribuo o valor dos  campos da linha que está sendo editada,
                    // à variáveis do tipo String, pois todos os campos são do tipo String.
                   
                            string txtCodAutor     =  ((TextBox)e.Item.Cells[0].Controls[0]).Text; 
                            string txtNome                       =  ((TextBox)e.Item.Cells[1].Controls[0]).Text; 
                            string txtSobreNome  = ((TextBox)e.Item.Cells[2].Controls[0]).Text; 
                            string txtTelefone       =  ((TextBox)e.Item.Cells[3].Controls[0]).Text;                       
                            
               DataRow  Linha = authors.Rows.Find(txtCodAutor);
                                             
                           //  Agora vamos editar o valor da linha.
                                        
                                        Linha.BeginEdit();
                                                   Linha["au_id"]            =  txtCodAutor;
                                                   Linha["au_fname"]      =   txtNome;
                                                   Linha["au_lname"]       =   txtSobreNome;
                                                   Linha["phone"]                        =  txtTelefone;
                                        Linha.EndEdit();
                                                               
                           // Agora crio os  comandos necessários para enviar
                           // as  alterações/inclusões/exclusões para o banco
                           // de dados pubs, no  servidor SQL Server 2000.
                     
                           // Em primeiro lugar  crio um objeto do tipo SqlCommandBuilder
                     
                           SqlCommandBuilder  CriaComando = new SqlCommandBuilder(MeuDataAdapter);
                     
                           // Agora defino a  propriedade UpdateCommand do objeto MeuDataAdapter.
                     
                           MeuDataAdapter.UpdateCommand=  CriaComando.GetUpdateCommand();
           
                           // Chamo o método Update do objeto  DataAdapter.
           
                           MeuDataAdapter.Update(ds,"authors");                                 
               
                                       MinhaGrade.DataSource  = source ;
                           MinhaGrade.DataBind();
             }
      
      </script>
    
   <body>
    
   <form runat=server>
    
   <h3><font  face="Verdana">DataGrid para edição de  dados.</font></h3>
   <HR>
<asp:Label 
                            id="txtTitulo" 
                           Font-Bold="True"       
                           runat="server"
                >
               </asp:Label>
               
   <BR>
            <asp:Label 
                            id="txtTitulo2" 
                           Font-Bold="True"       
                           runat="server"
               >
               </asp:Label>       
         
   <HR>   
            <asp:DataGrid
                           id="MinhaGrade"
                           BorderColor="black"
                            BorderWidth="1"
                            CellPadding="3"
                            AutoGenerateColumns="false"
                            runat="server"
                            EditItemStyle-BackColor="#c0c0c0"
                            EditItemStyle-ForeColoer="blue"
                            OnEditCommand="FazEdicao"
                            OnUpdateCommand="FazUpdate"
                            OnCancelCommand="CancelaAlteracoes"
               >
            <HeaderStyle
                           BackColor="#00aaaa"
                           Font-Bold="True"
                            Font-Name="Courier  New"
                            ForeColor="White"
               >
               </HeaderStyle>
            <Columns>
             <asp:BoundColumn
                            HeaderText="Código" 
                            DataField="au_id"
                            ItemStyle-BackColor="#c0c0c0"
                >
               
                </asp:BoundColumn>
            
   <asp:BoundColumn
                            HeaderText="Nome" 
                            DataField="au_fname"
                            ItemStyle-Font-Italic="True"
                            ItemStyle-Font-Name="Courier  New"
                >
               
                </asp:BoundColumn>
            <asp:BoundColumn
                         HeaderText="Sobrenome" 
                         DataField="au_lname"
                          ItemStyle-Font-Italic="True"
                         ItemStyle-Font-Name="Courier  New"
               >
                               
                </asp:BoundColumn>
            <asp:BoundColumn
                            HeaderText="Telefone" 
                            DataField="phone"
                            ItemStyle-BackColor="#c0ffff"
                            ItemStyle-Font-Bold="True"
                >
                
                </asp:BoundColumn>
            <asp:EditCommandColumn
                           EditText="Editar"
                           CancelText="Cancelar"
                           UpdateText="Atualizar"
               />
    </Columns>
    
    </asp:DataGrid>
    
    </form>
    
   </body>
   </html>

Digite o código da Listagem 15.2 e salve o mesmo em um arquivo chamado chap15ex2.aspx, na pasta chap15, dentro da pasta wwwroot, conforme descrito no item: “Check List para acompanhar os exemplos deste livro”, no Capítulo 6.

Para acessar esta página utilize o seguinte endereço:

http://localhost/chap12/chap15ex2.aspx

Ao carregar a página você obtém uma tabela com os dados sobre os autores. Observe a última coluna onde temos um link Editar, conforme indicado na Figura 15.4

Curso Completo de ASP.NET - Júlio Battisti
Figura 15.4 Link para colocar o DataGrid no modo de edição.

Dê um clique no link Editar, da primeira linha. Observe que os dados da linha passaram a ser exibidos em controles do tipo TextBox, nos quais podemos fazer as alterações necessárias. Altere o sobrenome do autor para Battisti, conforme indicado na Figura 15.5.

Curso Completo de ASP.NET - Júlio Battisti
Figura 15.5 Editando dados com o controle DataGrid.

Oberve que na última coluna, da primeira linha, ao invés do link Editar, passaram a ser exibidos dois links. Se você clicar no link Atualizar, as alterações serão enviadas para o banco de dados. Se você clicar no link Cancelar, as alterações serão descartadas e o DataGrid sairá do modo de edição e voltará a ser exibido somente o link Editar.

Dê um clique no botão Atualizar para confirmar as alterações. Observe que o sobrenome foi atualizado para Battisti e o DataGrid continua no modo de edição.Agora altere o sobrenome do autor da primeira linha, de volta para Bennet. Dê um clique no botão Cancelar. Observe que a última alteração é cancelada, isto é, o sobrenome continua sendo Battisti e o DataGrid saiu do modo de edição, conforme indicado na Figura 15.6.

Curso Completo de ASP.NET - Júlio Battisti
Figura 15.6 DataGrid no modo de visualização.

Comentários sobre o código do exemplo.

• Criamos um DataGrid, onde as colunas foram definidas manualmente, utilizando as tags <columns> </columns>. Para cada campo a ser exibido criamos uma coluna do tipo BoundColumn. O nome do campo associado com a coluna é definido pela propriedade DataField, como para a primeira coluna, que ira exibir dados do campo au_id:

<asp:BoundColumn
          HeaderText="Código" 
          DataField="au_id"
          ItemStyle-BackColor="#c0c0c0">

Para exibir a última coluna, onde são exibidos os links Editar, Atualizar ou Cancelar, dependendo do modo em que se encontra o DataGrid, utilizamos uma coluna do tipo EditCommandColumn:

<asp:EditCommandColumn
          EditText="Editar"
          CancelText="Cancelar"
          UpdateText="Atualizar">

Poderíamos definir uma série de propriedades desta coluna, porém definimos apenas o texto para o link de cada um dos comandos: Editar, Cancelar e Atualizar.

• Na definição do DataGrid definimos que as colunas não serão geradas automaticamente –    AutoGenerateColumns="false". A parte mais importante da definição do DataGrid, é a especificação dos procedimentos que serão executados quando o usuário clicar nos links Editar, Atualizar e Cancelar. Isto é feito através da definição das propriedades OnEditCommand (executado quando o usuário clica no link Editar), OnUpdateCommand (executado quando o usuário  clica no link Atualizar) e OnCancelCommand (executado quando o usuário clica no link Cancelar). A seguir temos a definição do DataGrid:

<asp:DataGrid
     id="MinhaGrade"
     BorderColor="black"
     BorderWidth="1"
     CellPadding="3"
     AutoGenerateColumns="false"
     runat="server"
     EditItemStyle-BackColor="#c0c0c0"
     EditItemStyle-ForeColoer="blue"
     OnEditCommand="FazEdicao"
     OnUpdateCommand="FazUpdate"
     OnCancelCommand="CancelaAlteracoes">

• Quando a página é carregada pela primeira vez, isto é, quando não for um PostBack, o texto do início da página é definido e o procedimento BuscaDados é chamado. Este procedimento faz a conexão com o banco de dados e exibe as informações obtidas no controle DataGrid. Neste momento está habilitado apenas o link Editar.

if(!Page.IsPostBack){
    txtTitulo.Text="Clique  em Editar para alterar os dados de uma linha!";
    BuscaDados();
}

• Quando o usuário clica no link Editar, dispara o evento OnEditCommand e é executado o procedimento FazEdicao. Este procedimento altera o texto dos labels txtTitulo e txtTitulo1 e coloca a linha onde o usuário clicou no link Editar, no modo de edição:

void FazEdicao(Object sender, DataGridCommandEventArgs e){
     txtTitulo.Text="Clique  em Atualizar para Confirmar as alterações!";
     txtTitulo2.Text="ou  Clique em Cancelar para descartar as alterações!";
     MinhaGrade.EditItemIndex  = e.Item.ItemIndex;
     BuscaDados();
}

O índice da linha onde o usuário clicou é retornado pela propriedade ItemIndex do argumento e (do tipo DataGridCommandEventArgs), passado como parâmetro para o procedimento. Este índice é atribuído a propriedade EditItemIndex do DataGrid. O efeito prático é colocar a respectiva linha no modo de edição.

• Quando o usuário clica no link Cancelar, as alterações são abandonadas, o texto dos labels é atualizado e o DataGrid é retirado do modo de edição e o procedimento BuscaDados é chamado para reexibir os dados no DataGrid:

void CancelaAlteracoes(Object sender, DataGridCommandEventArgs e){
     txtTitulo.Text="Clique em Editar para alterar os dados de uma linha!";            
     txtTitulo2.Text="";
     MinhaGrade.EditItemIndex = -1;
     BuscaDados();
}

Para retirar a linha do modo de edição atribuímos o valor –1 a propriedade EditItemIndex.

• Agora vamos analisar o procedimento FazUpdate, que é o procedimento mais complexo. Na parte inicial deste procedimento criamos os objetos para conexão com o banco de dados e preenchimento de um objeto DataView, com as informações originais da tabela authors.

O próximo passo é acessar os valores que foram digitados nos controles TextBox, da linha que está sendo editada. O ASP.NET cria uma coleção de controles do tipo TextBox, para a linha que está sendo editada. O primeiro controle possui o 0, o segundo o índice 1 e assim por diante. Para atribuir estes valores a variáveis do tipo string, utilizamos a seguinte sintaxe:

             string txtCodAutor   = ((TextBox)e.Item.Cells[0].Controls[0]).Text; 
             string txtNome       = ((TextBox)e.Item.Cells[1].Controls[0]).Text; 
             string txtSobreNome  = ((TextBox)e.Item.Cells[2].Controls[0]).Text; 
             string txtTelefone   = ((TextBox)e.Item.Cells[3].Controls[0]).Text;

O argumento e é do tipo DataGridCommandEventArgs. Este argumento tem uma propriedade chamada Item, a qual é uma referência a linha atual do DataGrid, ou seja, a linha que estamos editando. A propriedade Item é baseada na classe DataGridItem, a qual possui uma coleção chamada Cells, coleção esta que representa todas as colunas (cada coluna é considerada uma célula) do DataGrid. Então considere a seguinte referência:

e.Item.Cells[0] é uma referência a primeira coluna da linha que está sendo editada
e.Item.Cells[1] é uma referência a segunda  coluna da linha que está sendo editada

e assim por diante.

Em cada célula do DataGrid posso ter um ou mais controles. Estes controles fazem parte da coleção Controls da célula. O primeiro controle é acessado pelo índice 0 – Controls[0], o segundo pelo índice 1 – Controls[1] e assim por diante. No nosso caso temos então:

e.Item.Cells[0].Controls[0] é uma referência ao primeiro controle da primeira coluna da linha que está sendo editada
e.Item.Cells[1].Controls[0] é uma referência ao segundo controle da segunda  coluna da linha que está sendo editada

e assim por diante.

Cada controle, no nosso exemplo, é um objeto do tipo TextBox. Para acessar o valor contido neste controle, utilizamos a sua propriedade Text. Finalmente chegamos a seguinte conclusão:

e.Item.Cells[0].Controls[0].Text retorna o valor contido no primeiro (e único) controle da primeira coluna da linha que está sendo editada

e.Item.Cells[1].Controls[0].Text retorna o valor contido no primeiro (e único) controle da segunda coluna da linha que está sendo editada

e.Item.Cells[2].Controls[0].Text retorna o valor contido no primeiro (e único) controle da terceira coluna da linha que está sendo editada

e.Item.Cells[3].Controls[0].Text retorna o valor contido no primeiro (e único) controle da quarta coluna da linha que está sendo editada

Além disso tivemos que fazer uma conversão explícita, para o tipo TextBox. Isto é feito colocando-se o tipo TextBox entre parênteses na frente de cada um dos comandos.

De posse destes valores, utilizamos os passos aprendidos no capítulo 12, para enviar as atualizações para o banco de dados. Em resumo:

1.         Criamos um objeto DataTable.
2.         Definimos uma chave primária para este objeto.
3.         Localizamos a linha correspondente ao código do autor que está sendo editado.
4.         Atualizamos a linha no objeto DataTable.
5.         Enviamos as atualizações para o banco de dados.

Para maiores detalhes sobre estes passos, consulte o Capítulo 12, onde apresentamos explicações detalhadas sobre cada um destes passos.

Sem dúvida a parte mais complexa deste procedimento é o entendimento de como é feita a referência aos valores contidos em cada coluna da linha que está sendo editada. Podemos ver que existe uma hierarquia bem definida. O DataGrid é formado por uma colação de linhas. Cada linha é formada por uma coleção de colunas. Cada coluna pode conter um ou mais controle, os quais fazem parte da coleção Controls da coluna. Cada  controle é um objeto com uma série de propriedades e métodos. Utilizamos a propriedade Text do controle, para acessar o valor contido em cada controle.

Com o ASP 3.0 existia, para termos a mesma funcionalidade vista neste exemplo, temos um componente COM vendido separadamente, para simular as funcionalidades de edição que o DataGrid nos fornece apenas com a configuração de umas poucas propriedades.

« Lição anterior Δ Página principal ¤ Capítulos Próxima lição »
Quer receber novidades e e-books gratuitos?

 
 

Contato: Telefone: (51) 3717-3796 | E-mail: webmaster@juliobattisti.com.br | Whatsapp: (51) 99627-3434

Júlio Battisti Livros e Cursos Ltda | CNPJ: 08.916.484/0001-25 | Rua Vereador Ivo Cláudio Weigel, 537 - Universitário, Santa Cruz do Sul/RS, CEP: 96816-208

Todos os direitos reservados, Júlio Battisti 2001-2024 ®

LIVRO: MACROS E PROGRAMAÇÃO VBA NO EXCEL 2016 - CURSO COMPLETO E PRÁTICO

DOMINE A PROGRAMAÇÃO VBA NO EXCEL - 878 PÁGINAS - CLIQUE AQUI