Fórum Listar vários registros em uma tela e altrerá-los #3928

24/03/2009

0

Boa tarde! Estou com o seguinte problema:   - Preciso listar vários registros em uma tela e alterá-los, neste caso alunos de uma determinada turma.   - Só ficarei sabendo a quantidade de registros depois que fizer o Select no banco de dados.   - Cada registro possuirá os seguintes campos: Código e Nome, que não irei alterar nesta tela, e Av1,  Av2, Média, que irei alterar.   - O campo média será alterado após ser digitado a Av2, então realizarei o cálculo da média.   - A navegação entre os registros será através da tecla TAB de cima para baixo de cada coluna (campo) que estiver sendo editado.   - Após o(s) dado(s) ser(em) alterado(s) farei um update na tabela.   - Tipo de aplicação: WebAplication (Webform), ASP.NET/Vb.Net.   O meu maior problema mesmo é saber como fazer isso utilizando textbox?   Indemberge
Indemberge Santos

Indemberge Santos

Responder

Posts

24/03/2009

[devmedia .net]

Olá, tudo bem ? Sobre o seu desejo não é complicado fazer, se eu entedi bem...   Há algum tempo atrás um usuário me pediu para fazer um artigo para ele justamente com essa dúvida..
Estou lhe enviando o mesmo artigo, que com certeza te ajudará.  
Primeiramente devemos definir o objeto SqlDataSource, que será o intermediário entre o controle GridView e a fonte de dados SQL Server. É através dele que vamos configurar as colunas à serem exibidas e editadas no controle GridView. Como já vimos isso nos capítulos anteriores, vamos pular esta parte, mas apenas chamo a atenção para o momento que definir as colunas onde, haverá um botão chamado Advanced... , o qual deveremos clicar. Com isso uma janela será exibida e devemos marcar a opção "Generate INSERT, UPDATE and DELETE statements" que com isso os comandos de Insert, Update e Delete serão automaticamente gerados baseando-se nas colunas que selecionamos no SelectCommand. A imagem abaixo ilustra este processo: Figura 1 - Definindo os comandos de CRUD.
Feito isso temos que vincular esta fonte de dados ao controle GridView através da propriedade DataSourceID. Com este vínculo podemos então definir as colunas que desejamos exibir no controle GridView e, além disso, devemos adicionar uma coluna do tipo CommandField ou apenas marcando a opção Enable Editing na Smart Tag. Através das imagens abaixo vemos estes dois processos respectivamente:     Figura 2 - Definindo a coluna do tipo CommandField.
Figura 3 - Habilitando a edição de registros através da propriedade Enable Editing da Smart Tag.
O código HTML gerado com essas configurações na página ASPX está sendo exibido abaixo: <asp:SqlDataSource     ID="SqlDataSource1"     runat="server"     ConnectionString="<%$ ConnectionStrings:ConnString %>"     SelectCommand="SELECT Email, Nome, UsuarioID FROM Usuario"     UpdateCommand="UPDATE Usuario SET Email = @Email, Nome = @Nome         WHERE UsuarioID = @original_UsuarioID">     <UpdateParameters>         <asp:Parameter Name="Email" Type="String" />         <asp:Parameter Name="Nome" Type="String" />         <asp:Parameter Name="original_UsuarioID" Type="Int32" />     </UpdateParameters> </asp:SqlDataSource>   <asp:GridView     ID="GridView1"     runat="server"     AutoGenerateColumns="False"     DataKeyNames="UsuarioID"     DataSourceID="SqlDataSource1">     <Columns>         <asp:CommandField             ShowEditButton="True" />         <asp:BoundField             DataField="UsuarioID"             HeaderText="UsuarioID"             ReadOnly="True" />         <asp:BoundField             DataField="Email"             HeaderText="Email" />         <asp:BoundField             DataField="Nome"             HeaderText="Nome" />     </Columns> </asp:GridView> ASPX      
Analisando o código acima vemos o que já descrevemos: a vinculação do objeto de Data Source ao controle GridView. A única propriedade que vemos neste código e que ainda não nos deparamos é a propriedade ReadOnly. Esta é utilizada quando não queremos habilitar um registro que é exibido no controle GridView para edição. Um caso comum é quando temos em nosso GridView o ID ou um código de registro em que não devemos alterá-lo. Ao definí-la para True, a coluna é exibida apenas em forma de Label, mesmo a linha em formato de edição, assim como podemos ver a imagem abaixo:  
Observação: A propriedade DataKeyNames, que no caso deste exemplo está definida como UsuarioID, ou seja, é o ID do registro, faz se necessário, pois o ASP.NET utiliza esta propriedade para recuperar o ID do registro corrente que está sendo editado e passa este valor para o parâmetro original_UsuarioID (qual vamos analisá-lo mais adiante, em um artigo posterior) e, conseqüentemente, o comando responsável pela atualização (UpdateCommand) utilizará este valor para persistir as alterações na base de dados.

Utilizando o objeto ObjectDataSource

Como a forma de definirmos as colunas é independente da fonte de dados que estamos utilizando, apenas vamos nos restringir a falar de como configurar os métodos a serem utilizados para este processo, já que o restante é da mesma forma que utilizamos com o objeto SqlDataSource.

Devemos primeiramente criar um método responsável pela atualização dos dados na fonte de dados que, por sua vez, receberá os parâmetros necessários para efetuar tal atualização. No cenário que vamos utilizar, este método receberá três parâmetros: nome, email e ID (identificação do registro como único) e o método se chamará Update. Abaixo é exibido como criar este método na classe de negócios: public void Update(string nome, string email, int id) {     SqlConnection conn = new         SqlConnection(             WebConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);       SqlCommand cmd =         new SqlCommand("UPDATE Usuario SET Nome = @Nome, Email = @Email             WHERE UsuarioID = @ID", conn);       cmd.Parameters.AddWithValue("@Nome", nome);     cmd.Parameters.AddWithValue("@Email", email);     cmd.Parameters.AddWithValue("@ID", id);       try     {         conn.Open();         cmd.ExecuteNonQuery();     }     finally {         if (conn != null) {             conn.Close();         }     } } Public Sub Update(ByVal nome As String, ByVal email As String, ByVal id As Integer)     Dim conn As New _         SqlConnection(             WebConfigurationManager.ConnectionStrings("ConnString").ConnectionString)       Dim cmd As New _         SqlCommand("UPDATE Usuario SET Nome = @Nome, Email = @Email             WHERE UsuarioID = @ID", conn)       cmd.Parameters.AddWithValue("@Nome", nome)     cmd.Parameters.AddWithValue("@Email", email)     cmd.Parameters.AddWithValue("@ID", id)       Try         conn.Open()         cmd.ExecuteNonQuery()     Finally         If Not IsNothing(conn) Then             conn.Close()         End If     End Try End Sub C#    
Analisando o código acima vemos que é criado um objeto que é responsável pela conexão com a fonte de dados e outro objeto em qual definimos a query T-SQL a ser executada (neste caso, uma query de Update). Definidos estes objetos, utilizamos o método AddWithValue da coleção de parâmetros do objeto SqlCommand para adicionarmos os parâmetros necessários para executarmos a query de atualização. Finalmente abrimos a conexão com a fonte de dados, invocamos o método ExecuteNonQuery para executar o comando e posteriormente fechamos a conexão com a fonte de dados.

Depois do método codificado corretamente na classe que contém as regras de negócios devemos então, neste momento, configurar o objeto ObjectDataSource onde, na propriedade UpdateMethod, definiremos este método e seus respectivos parâmetros. O código ASPX abaixo mostra este configuração: <asp:ObjectDataSource     ID="ObjectDataSource1"     runat="server"     SelectMethod="ResgataUsuarios"     TypeName="Usuarios"     UpdateMethod="Update">     <UpdateParameters>         <asp:Parameter Name="nome" Type="String" />         <asp:Parameter Name="email" Type="String" />     </UpdateParameters> </asp:ObjectDataSource>   <asp:GridView     ID="GridView1"     runat="server"     AutoGenerateColumns="False"     DataSourceID="ObjectDataSource1">     <Columns>         <asp:CommandField ShowEditButton="True" />         <asp:BoundField             DataField="ID"             HeaderText="ID" />         <asp:BoundField             DataField="Email"             HeaderText="Email" />         <asp:BoundField             DataField="Nome"             HeaderText="Nome" />     </Columns> </asp:GridView> ASPX      
Analisando o código superior vemos todos os parâmetros que definimos na assinatura do método Update configurados na seção UpdateParameters que, automaticamente, o ASP.NET define seus valores e invoca o método Update quando o usuário clicar no botão de atualização.

Muitas vezes o método de atualização não espera tipos de dados simples como vimos acima, ou seja, o mesmo receberá ao invés de strings contendo os valores como por exemplo nome, email, etc., ele receberá um objeto complexo do tipo Usuario, que contém suas propriedades. Neste cenário devemos modificar o código do método de atualização para receber este tipo de objeto e também ajustar a propriedade DataObjectTypeName no controle ObjectDataSource que é onde definimos uma string contendo o tipo de objeto que este controle irá trabalhar. Para exemplificar melhor isso, veremos abaixo o código HTML da página ASPX e o método responsável pela atualização, recebendo em seu parâmetro um tipo complexo: <asp:ObjectDataSource     ID="ObjectDataSource1"     runat="server"     SelectMethod="ResgataUsuarios"     TypeName="Usuarios"     DataObjectTypeName="Usuario"     UpdateMethod="Update"> </asp:ObjectDataSource> ASPX         public void Update(Usuario u) {     SqlConnection conn = new         SqlConnection(             WebConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);       SqlCommand cmd =         new SqlCommand("UPDATE Usuario SET Nome = @Nome, Email = @Email             WHERE UsuarioID = @ID", conn);       cmd.Parameters.AddWithValue("@Nome", u.Nome);     cmd.Parameters.AddWithValue("@Email", u.Email);     cmd.Parameters.AddWithValue("@ID", u.ID);       try     {         conn.Open();         cmd.ExecuteNonQuery();     }     finally {         if (conn != null) {             conn.Close();         }     } } Public Sub Update(u As Usuario)     Dim conn As New _         SqlConnection(             WebConfigurationManager.ConnectionStrings("ConnString").ConnectionString)       Dim cmd As New _         SqlCommand("UPDATE Usuario SET Nome = @Nome, Email = @Email             WHERE UsuarioID = @ID", conn)       cmd.Parameters.AddWithValue("@Nome", u.Nome)     cmd.Parameters.AddWithValue("@Email", u.Email)     cmd.Parameters.AddWithValue("@ID", u.ID)       Try         conn.Open()         cmd.ExecuteNonQuery()     Finally         If Not IsNothing(conn) Then             conn.Close()         End If     End Try End Sub C#    
É importante dizer que quando utilizamos o objeto complexo, no caso Usuario, deverá obrigatoriamente ter um construtor público sem parâmetros, as propriedades deverão ser estar definidas como públicas e com o mesmo nome que são passadas para o GridView e, as propriedades devem aceitar leitura e escrita (Get e Set).       Aguardo contato,   Abraços   Carlos Jr
Responder

Gostei + 0

24/03/2009

Indemberge Santos

Carlos; Eu esqueci de dizer que a fonte de dados que utilizo é o ACCESS 2000 (questões de custo), e para acessar essa fonte de dados utilizo uma classe, ou seja, trabalho em camadas, essa classe acessa o DataSet e então eu retorno os dados para o meu objeto através de um método. Se puder me dá um exemplo dessa forma, agradeço.   Outra coisa, entendo muito pouco de C#, conheço um pouco de C++ de um curso que fiz e da faculdade, conheço mais o VB6 e o VB.Net, no qual venho adquirindo conhecimentos nos últimos três anos e desenvolvendo aplicações.   Gostaria mesmo que o código fosse em VB.     Indemberge
Responder

Gostei + 0

25/03/2009

[devmedia .net]

Olá, bom primeiramente, lhe aconselho a tirar o access e utilizar o sql 2005 express, não tem nenhum custo pois é gratuito, outra coisa é MUUUIIITTTOOOO melhor que access.   O tutorial que lhe enviei é bem prático e simples de fazer, independente de linguagem, seja ela C# ou VB.NET, pois 90% das coisas é um Wizard que faz, e tem um pequeno código em C# que é bem simples de entender e fácil de passar para VB.NET.   Independente da sua estrutra a solução é a mesma, digo a idéia da solução é a mesma. Não há como criar um um exemplo para você sem que você faça alguma alteração, alguma coisa terá que adaptar, entender como funciona e colocar no seu projeto.   Segue uma video aula que explica exatamente o que deseja fazer...
https://www.devmedia.com.br/articles/viewcomp.asp?comp=9191   Caso não tenho acesso a mesmo, favor solicitar pois lhe daremos acesso gratuito a ela.   Existe  este artigo da Microsoft que explica tudo sobre a edição no grid, pra que reinventar a roda se já tem pronto, entende !? http://msdn.microsoft.com/pt-br/library/aa581776.aspx#XSLTsection124121120120   Veja essa video aula e qualquer coisa me fale, estou aqui para lhe ajudar na solução.
Grande Abraço

Carlos Jr
Responder

Gostei + 0

25/03/2009

Indemberge Santos

Carlos;   O SqlExpress é gratuito para utilizar, mas não em caso de hospedagem, pois onde eu hospedava o site inicialmente para teste, cobraram R$ 50,00 mensais a mais pela hospedagem, contudo depois que o sistema estiver em total funcionamento e livre daquela suspeita de que "será que vai dar certo" eu pretendo trocar a base de dados,  então abrirei um chamado para esta situação.   Com respeito a linguagem de programação, eu  havia falado com a atendente que a linguagem que utilizo é VB.NET, então não havia porque me dá exemplos em C#, contudo se você não tem condições de falar a mesma linguagem que a minha não há necessidade de enviar exemplos em C#, pois não será útil.   Outra coisa, para ver se conseguimos resolver essa questão irei gerar um outro material expondo a situação.   Indemberge  
Responder

Gostei + 0

25/03/2009

[devmedia .net]

Opa, não , você me entendeu mal.. desculpe.. Não quis dizer que você tem que se virar... O que eu quero dizer é que a solução é a mesma, sendo C# ou VB.NET , pois a utilização do Wizard é comum as duas linguagens...   Nosso objetivo na consultoria é ajudar o usuário a entender o funcionamento para resolução da dúvida, como lhe passei a video aula justamente sobre o que você necssita, não há segredos na solução, como lhe disse também, não adianta eu lhe enviar um código que faça isso, posi alguma modificação você terá que fazer. Quanto a base de dados tudo bem, foi apenas um conselho, e não sabia que estava publicando essa aplicação, portanto não me julgue sobre isso, estou aqui para lhe fornecer a melhor solução seja ela qual for, como a base de dados, pois access é não é banco de dados, então eu preocupado com seu desempenho na aplicação lhe dei um conselho, que é o meu papel.   Eu não tinha informações que seu desejo era por VB.net, pois quando você me informou da dúvida eu não sabia a linguagem a ser utilizada, fiquei sabendo na sua resposta.   A video aula que lhe enviei ensina justamente o que você precisa, você viu a video aula?   Aguarde e lhe enviarei a solução completa.   Abraços   Carlos Jr    
Responder

Gostei + 0

26/03/2009

[devmedia .net]

Olá Indembergue, tudo bem ? Vamos dar continuidade ao chamado ?? No aguardo.. Abraços
Carlos Jr
Responder

Gostei + 0

26/03/2009

Luiz Maia

Ola Indemberg, seu post foi redirecionado para mim.   Pelo que entendi, vc quer fazer uma aplicação que exibe seus dados numa grid e edita eles usando metodos e nao o wizard do VS, correto?
Responder

Gostei + 0

26/03/2009

Luiz Maia

Indemberg,       Vc precisara de um DataSource que seja lincado num GridView e as propriedades de Update, delete sejam habilitadas dinamicamente, vc precisa criar um DataSet Tipado.   Mas como vc já fez suas consultas de CRUD, vc deve chamar os metodos a mão mesmo. Siga os passos abaixo:   Crie uma coluna usando TemplateField no GridView e jogo o ID do registro no CommandArgument; Crie um metodo de Edição que vc passara este Id como parametro; Crie outra coluna identica a de Editar para Exclusão, e faça um metodo de exclusão tb. Use o RowDataBound para pegar o Id e jogar no CommandArgument.   De uma olhada abaixo:   Agora que você já tem os dados populados na sua GridView, você precisa ter uma coluna com um botão de edição, segue abaixo uma sugestão, repare nas duas ultimas colunas da Grid que possuem imagebuttons, uma para edição e outr para exclusão. <asp:GridView ID="gvDados" runat="server" AutoGenerateColumns="False" DataKeyNames="codfiscal" OnRowDataBound="gvDados_RowDataBound" AllowPaging="True" OnPageIndexChanging="gvDados_PageIndexChanging"> <Columns> <asp:BoundField DataField="numGtd" HeaderText="Número" /> <asp:BoundField DataField="nomDocum" HeaderText="Tipo" /> <asp:TemplateField HeaderText="Alterar" SortExpression="codGtd"> <ItemStyle HorizontalAlign="Center" /> <HeaderStyle HorizontalAlign="Center" Width="1px" /> <ItemTemplate> <asp:ImageButton ID="ibAlterar" runat="server" CausesValidation="False" ImageUrl="~/Images/btn_alterar.gif" OnCommand="Alterar" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Excluir" ShowHeader="False"> <ItemStyle HorizontalAlign="Center" /> <HeaderStyle HorizontalAlign="Center" Width="1px" /> <ItemTemplate> <asp:ImageButton ID="ibExcluir" runat="server" CausesValidation="False" ImageUrl="~/Images/btn_excluir.gif" OnClientClick="javascript:return ConfirmaExclusao('esta GTD');" OnCommand="Excluir" /> </ItemTemplate> </asp:TemplateField> </Columns> <PagerStyle Font-Bold="True" ForeColor="White" /> </asp:GridView>   No evento RowDataBound do GridView, vc coloca os commadsArguments para os itens que deseja editar.   Note que o metodo acima (RowDataBound) é invocado no GridView na coluna Alterar. Agora é só usar um Panel, por exemplo, e mandar as informações que vc deve recuperar na base para os controles dentro dele, já que vc já tem o ID do registro que deseja alterar. Pode usar a própria parte de cadastro.   Tenho um exemplo de aplicação que fiz ontem para outro solicitante, disponibilizei ele no Disco Virtual, mas esta em C#, caso queira, posso disponibilizar pra vc tb, vera que é bem simples e vc podera fazer a transcricao para vbnet facilmente.   Caso não entenda algum passo, me avise. Aguardo seu retorno.   Att Luiz Maia
Responder

Gostei + 0

26/03/2009

Devmedia

Indemberg,
a solução proposta pelo consultor sanou a dúvida. É necessário um exemplo prático, um video, sobre o assunto para facilitar?
No aguardo!
Responder

Gostei + 0

27/03/2009

Indemberge Santos

Luiz; Tudo bem?   Sou Supervisor de Informática de uma rede de escolas, Tecnólogo em Redes de Computadores, Programador (trabalhei muito tempo com linguagem procudural, Clipper) Vb, venho nos últimos três anos estudando a tecnologia ASPNET e adotei como linguagem de programação Vb.Net.   Em 2006 fiz um treinamento ASPNET/Vb.Net onde aprendi a desenvolver aplicações em camadas, utilizando Classe e DataSet.   Estou desenvolvendo um Sistema de Controle Acadêmico (SCA) que atenderá a várias unidades da rede onde trabalho, permitindo acesso via internet para matrícula de alunos e principalmente lançamento de notas.   Estou produzindo um vídeo para explicar melhor o que preciso, como fui orientado, assim que concluir te envio, devo terminar entre hoje e amanhã.   Um abraço;   Indemberge    
Responder

Gostei + 0

27/03/2009

Devmedia

Indembergue,
o que foi perguntado é se o consultor deveria criar um video para sua maior compreensão da solução proposta e não que o vc criasse um video.
Mas se assim preferir, vc pode postar o video, assim o consultor saberá perfeitamente o que deseja.
Abs.
Responder

Gostei + 0

27/03/2009

Indemberge Santos

Ok! Eu entendi que deveria postar o minha dúvida por vídeo, mas tudo bem, acabei de preparar e irei postar.   No final de semana irei testar a solução proposta pelo consultor e dar um retorno a respeito.   Obrigado!   Indemberge
Responder

Gostei + 0

27/03/2009

Indemberge Santos

Listar registros em um formulário e editá-los.

[#VIDEO-89#]
Responder

Gostei + 0

27/03/2009

Indemberge Santos

Editando registros em um formulário

[#VIDEO-89#]
Responder

Gostei + 0

27/03/2009

Indemberge Santos

Luiz;   Tentei colocar um vídeo, mas não consegui.   Pelo o que eu entendi, com respeito a sua solução proposta, eu poderia colocar um botão para editar o registo que o usuário selecionasse, contudo acho que no caso de professores que dão aula para uma turma com média de 40 alunos ficaria um pouco lenta a inclusão/edição dos dados, você não acha?   Será que não existe outro meio de listarmos esses registros e disponibilizarmos para edição.   Aqui nós temos uma aplicação em ASP que na página de lançamento de notas, no Load do formulário, armazena os dados de cada registro em um textbox nomeando cada um em um looping com o registro do aluno, ex: txt857584, para que seja possível a atualização dos dados.   Eu até pensei em fazer assim, o problema é que eu não sei como fazer isso no código ASP.Net. pois dessa forma poderia navegar pelos registros utilizando a propriedade tabindex de cada objeto, e ao final da edição dos dados ter um botão para gravar os dados.   Caso seja necessário o código ASP antigo, me avise, eu tenho ele aqui.     Indemberge
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar