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
« 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
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.
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.
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 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 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. 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 » |
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