Listar vários registros em uma tela e altrerá-los

24/03/2009

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

Curtidas 0

Respostas

[devmedia .net]

[devmedia .net]

24/03/2009

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
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

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
GOSTEI 0
[devmedia .net]

[devmedia .net]

24/03/2009

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
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

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  
GOSTEI 0
[devmedia .net]

[devmedia .net]

24/03/2009

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    
GOSTEI 0
[devmedia .net]

[devmedia .net]

24/03/2009

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

Luiz Maia

24/03/2009

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?
GOSTEI 0
Luiz Maia

Luiz Maia

24/03/2009

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
GOSTEI 0
Devmedia

Devmedia

24/03/2009

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!
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

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    
GOSTEI 0
Devmedia

Devmedia

24/03/2009

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.
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

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
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

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

[#VIDEO-89#]
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

Editando registros em um formulário

[#VIDEO-89#]
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

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
GOSTEI 0
Devmedia

Devmedia

24/03/2009

Indemberg,
seus videos não foram postados corretamente. O consultor não conseguirá visualizar os mesmos. Se estiver com dúvidas em como responder com video, assista ao video disponível na home:
https://www.devmedia.com.br/marcadores/abrir_chamado_video/video%20como%20abrir%20chamado%20com%20video.htm

Se a dúvida persistir nos avise.
GOSTEI 0
Luiz Maia

Luiz Maia

24/03/2009

Indemberg,   O processamento de 40 registros é instantaneo, não se preocupe com performace neste caso. Para edição e exclusão de registro vc deve usar um GridView com as colunas pertinentes aos eventos, não tem outro jeito.   Vc pode fazer um drowdownlist com os alunos e o prof selecionar qual ele quer executar, mas a navegabilidade disto é pessima. O ideal é uma grid mesmo.   Aguardo suas duvidas e/ou criticas.   Caso queira podemos fazer isto pra vc juntos, mas vamos por partes, ok?   Abraços   Att Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

Luiz; Eu vou fazer um teste utilizando o grid e seguindo suas orientações, provavelmente no final de semana, assim que concluir entro em contato contigo.   Tenha um bom final de semana;   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

24/03/2009

OK Indemberg, caso tenha alguma durante o final de semana podee posta-la que dou uma olhada sem problemas. Abraços   Att Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

Luiz;   Examinei o código que você me enviou e pelo que entendi, eu irei colocar um botão que ao ser clicado irá abrir um outro form para edição das notas, certo?   O botão excluir, não será necessário, apenas alterar...   O problema é que assim já faço para o cadastro de alunos, eu tenho um grid que lista registros alunos de acordo com uma consulta feita pelo usuário, pode ser por nome ou código, então o usuário clica no nome do aluno e em um outro formulário (formview) ele altera os dados do aluno. Aqui é tranquilo, porque ele não segue nenhuma ordem, agora no lançamento de notas, ele segue a ordem do diário, então se eu direcioná-lo para outro formulário terei problemas, pois será muito lento, e depois pra voltar pro grid?   Não achei a idéia boa, apesar de não ter concluído tudo e ver funcionando...   Passei a sexta-feira e hoje, segunda-feira, tentando montar uma vídeo, mas não consegui, o software que utilizava era o CAMSTUDIO, vocês orientam usar o CAMTASIA, que é pago, bem vi e revi a vídeo que explica como criar a vídeo mas não consegui...   O meu problema é editar esses registros sem sair do grid, eu tenho isso no sistema antigo, ele pega todos os registros da tabela, lista na tela e permite alterar as notas e no final, gravar os dados, o único problema é que alguns professores esquecem de clicar no botão para atualizar os dados e depois dizem que os dados foram perdidos, neste caso seria melhor gravar a cada registro alterado....   Caso você tenha uma vído mostrando como será feira a alteração dos registro no Grid, seria bom para que eu possa ver como ficará a edição e então concluir com essa rotina.   Muito obrigado pela atenção;   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

24/03/2009

Indemberg,   Preciso saber o que realmente quer fazer. Vc quer editar os registros direto na grid? E forma que te passei não é outro FORM, vc apenas habilita um PANEL embaixo da grid que exibira os dados do aluno, e quando o prof clicar em editar, os dados são atualizados na grid acima.   Caso o que realmetne queira é editar direto na grid, posso te passar algumas video aulas para dar uma olhada, vera que é muito facil de fazer, bem mais que o metodo do PANEL, mas isto vale para grid que tenha poucas colunas, por exemplo, Nome do Aluno e Nota, assim fica bom. Mas quando tem muitas colunas fica pessimo.   Aguardo seu retorno para podermos dar continuidade. Me diga qual forma prefere. Abraços   Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

Luiz; Bom dia!   Eu prefiro editar no próprio grid, agora com respeito ao número de colunas, acredito que não deva passar de 15 (quinze) colunas, atualmente temos os seguintes campos (colunas): codAluno, nome, faltaAv1 (Checkbox), Av1, faltaAv2 (Checkbox), Av2, faltaAv3 (Checkbox), Av3, Rv (Reavaliação), Mb (Média Bimestral), totalizando 10 campos.   O usuário (professor) irá marcar o checkbox para informar que o aluno faltou a avaliação correspondente, e eu irei dessabilitar o campo da avaliação correspondente, depois que lançar a última avaliação do bimestre irei calcular a média.   Se tiver como disponibilizar alguma vídeo aula, agradeço, pois preciso finalizar esta rotina o mais breve possível, já estamos quase no fim do primeiro bimestre.   Um abraço;   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

24/03/2009

Indemberg,   Se vc quer mesmo fazer a edição na propria GrigView, mesmo eu achando que 15 colunas são extremamente muitas, por favor de uma olhada neste artigo que é bem explicativo. Caso não entenda algo, eu faço um VIDEO pra você.     Edição de dados no GridView - ASP.NET 2.0 Nas aplicações WEB, edição de dados via Browser sempre foi um desafio para os desenvolvedores. O fato é que independente do tipo de controle, aplicação ou plataforma, alguns usuários necessitam alterar os dados diretamente na base de dados. Até aqui nada de novidade, pois você pode utilizar uma UI de acordo com o perfil e a necessidade dos usuários. No ASP.NET 1.1 temos o controle DataGrid, o qual foi uma implementação da Microsoft para expressar qualquer fonte de dados. Este controle, sem nenhuma dúvida, é um dos mais utilizados nas páginas, seja pela apresentação, facilidade de uso e implementação ou performance. No entanto, é necessário digitar códigos para estas alterações. No ASP.NET 2.0 o DataGrid deixou de existir e foi criado um novo controle chamado GridView, o qual provê mais funcionalidades e sua implementação é extremamente simples e fácil. Abra o Visual Studio .NET 2005, selecione o menu File / New / Web Site e crie um novo projeto com as seguintes características: Clique em OK para criar o projeto. Abra o Solution Explorer, clique com o botão direito sobre a solução e selecione Add New Item do tipo Web Form chamado EdicaoDadosGridView.aspx. Digite um texto no corpo da página, exiba a Toolbox, a categoria Data e arraste o controle GridView. É exibida uma Smart Tag contendo as opções disponíveis neste momento. Selecione Auto Format e aplique uma formatação para personalizar a exibição do GridView. O próximo passo é definir uma fonte de dados. Em Choose Data Source, selecione <new data source>. São exibidas todas as possíveis fontes de dados para o controle GridView, e como usaremos o banco de dados Northwind do SQL Server como exemplo, selecione Database. Note que você usar qualquer provider existente para .NET. Clique em OK. Para montar a conexão, você duas opções: 1. Caso já tenha definida alguma conexão que esteja armazenada no arquivo Web.Config, esta é exibida na lista para que você use-a. A enorme vantagem disto ocorre na manutenção de qualquer item da string de conexão. Neste caso, vou utilizar a conexão chamada myConnection que eu já criei em outro artigo.
2. Clique no botão New Connection, informe os dados da conexão e teste para verificar o acesso.
Clique em Next e selecione a tabela Products. Atenção: não selecione uma consulta, tem que ser uma tabela. Selecione os campos a serem exibidos para alteração. Ainda nesta tela, clique no botão Advanced e selecione os dois checkboxes para criar os métodos do DataSet (Insert, Update e Delete). Clique em OK e em Next. Clique no botão Test Query para visualizar os dados. Por fim, clique em Finish. Automaticamente é exibida a Smart Tag com outras opções. Marque os seguintes checkboxes: Enable Paging (permite a paginação automática sem nenhum código), Enable Sorting (permite a classificação das colunas), Enable Editing (exibe o botão para editar os dados) e Enable Deleting (permite e exclusão de dados). Customização das colunas Como você pode observar, o layout das colunas não estão adequados ao contexto, e para isso vamos customizar. Na Smart Tag, selecione Edit Column. Como a primeira coluna é do tipo Command Field, altere as propriedades DeleteText para Excluir, EditText para Editar, CancelText para Cancelar e UpdateText para Atualizar. Altere o Header de cada uma das colunas sendo: Cod, Produto, Estoque e Preço. No caso da coluna Estoque e Preço, altere a propriedade DataFormatString para {0:n0} e {0:n2} respectivamente, sendo o formato numérico com zero e duas casas decimais. Além disto, altere a propriedade ItemStyle/HorizontalAlign para Right para alinhar os itens à direita. Veja o novo GridView formatado. Salve o projeto e execute-o no browser (CTRL + F5). Selecione um produto a ser alterado e clique no Editar para alterar os dados. Para efetivar as alterações, clique no Atualizar. Note que o campo ProductID (Cod) é chave primária e, automaticamente não é possível alterá-lo. Veja as alterações efetivadas. Caso queira cancelar, basta clicar no botão Cancelar.   Aguardo um retorno seu Indemberg. Abraços   Att Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

Luiz; Pelo que eu vi, voltei pro início de tudo.   Mas isso não tem nada a ver contigo.   É que quando tentamos fazer essa rotina pela primeira vez (há dois meses), tinhamos a opção de fazer pelo Wizard, e então achamos que perderíamos um pouco o controle sobre os dados, então não fizemos.   Agora volto pro ponto inicial.   Vou fazer o seguinte, vou seguir com a opção que você me deu, fazer utilizando um panel, e ver como vai ficar.   Acredito que até quinta-feira decidimos isso.   Caso precise de ajuda, provavelmente vou precisar, entro em contato.   Um abraço;   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

24/03/2009

Vc fez a escolha correta, nos padroes de navegabilidade sugeridos pela W3C (orgão regulamentador da web) eles falam sobre isto, toda edição deve ser fora da grid, ainda mais no seu caso que serão varias colunas, iria ficar muito ruim.   Estou a disposição, qualquer coisa me comunique.   Abraços Att Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

Luiz;   Não entendi quando você diz: "No evento RowDataBound do GridView, vc coloca os commadsArguments para os itens que deseja editar".   Você disse que tem um exemplo em C#, tem como me enviar, vou precisar de um exemplo.   Um abraço;   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

24/03/2009

Indemberg,   O RowDataBound é um evento disparado a cada registro listado no gridview, é uma especie de loop que varre os registros e herdam de GridViewRowEventArgs .   Faça o seguinte:   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:   protected void gvDados_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { string codItem = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "codGtd")); ImageButton ibAlterar = e.Row.FindControl("ibAlterar") as ImageButton; ImageButton ibExcluir = e.Row.FindControl("ibExcluir") as ImageButton; ibExcluir.CommandArgument = codItem; ibAlterar.CommandArgument = codItem;} }         E aqui você chama o método que precisa: protected void Alterar(object sender, CommandEventArgs e) { int codItem = Convert.ToInt32("0" + e.CommandArgument); EditarItem(codItem); }   Note que o metodo acima é 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.     O DataRowBound é um recurso que varre seus registros do GridView, para implementa-lo, vá até as propriedades do GridView, no Properties, clique no raio Events e vc vera esta evento la, dê dois cliques nele que seu evento estara criado.     ImageButton ibAlterar = e.Row.FindControl("ibAlterar") as ImageButton;
ImageButton ibExcluir = e.Row.FindControl("ibExcluir") as ImageButton;
ibExcluir.CommandArgument = codItem;
ibAlterar.CommandArgument = codItem;}   Considerações do trecho acima: Foram criados dois ImageButton, usamod o findcontrol para "acha-los" dentro do GridView; O CommandArgument é um atributo destes controles onde podemos armazenar valores, no seu caso o ID de cada linha.     string codItem = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "codTeste")); Esta linha é usada dentro do DataRowBound para receber os valores de sua coleção para cada registro. Por exemplo, vc tem na sua base 3 registros:   codTeste    dscNome 1                Luiz 2                Agnelo 3                Maia     Quando vc usa o DataRow, ele varre os registros e vai setando-os para cada linha no GridView. Repare que o codigo acima, recupera o codTeste, para recuperar o nome, usa-se:   string codItem = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "dscNome")); E quando vc joga este valor no commandArgument, cada linha do GridView assume o valor do registro da vez.     Seria altamente recomendavel vc ler este artigo:   https://www.devmedia.com.br/articles/viewcomp.asp?comp=9281   Caso não possua acesso, providenciamos para vc!     Segue uma aplicação de exemplo que fiz para um soliticante. Tem todos os metodos de um CRUD no arquivo Descricao.aspx dentro da pasta Adminstracao.     http://video.devmedia.com.br/naoexclusivo/LuizMaia/Consultoria/fernando01.zip     Aguardo seu retorno Indemberg, Abraços   Att Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

Luiz;   Não consegui passar para Vb o trecho abaixo:   protected void Alterar(object sender, CommandEventArgs e) { int codItem = Convert.ToInt32("0" + e.CommandArgument); EditarItem(codItem); } Eu fiz assim:   Protected Sub Alterar(ByVal sender As Object, ByVal e As System.EventArgs) Dim vCodAluno As String vCodAluno = Convert.ToString(e.commandArgument) EditarItem(vcodAluno) End Sub Na linha: vCodAluno = Convert.ToString(e.commandArgument)   Está dando erro em e.commandArgument   Acredito que devo chamar um função EditarItem passando como parâmetro o Codigo do Aluno (vCodAluno), certo?     Com respeito ao RowDataBound, eu fiz assim:   Protected Sub gvwLancaNota1B_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvwLancaNota1B.RowDataBound If (e.Row.RowType = DataControlRowType.DataRow) Then Dim vCodAluno As String Dim vibAlterar As ImageButton vCodAluno = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "CodAluno")) vibAlterar = e.Row.FindControl("ibAlterar") vibAlterar.CommandArgument = vCodAluno End If End Sub     Aqui aparentemente está ok!   Um abraço;   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

24/03/2009

Na assinatura do metodo, o parametro esperado é um CommandEventArgs, e não um ByVal e As System.EventArgs.   Apenas troque a assinatura de seu metodo. Abraços   Att Luiz Maia
GOSTEI 0
Luiz Maia

Luiz Maia

24/03/2009

E ai Indemberg, conseguiu arrumar? Estou aguardando um retorno seu.   Abraços Att Luiz Maia
GOSTEI 0
Devmedia

Devmedia

24/03/2009

Indembergue,
a resposta do consultor solucionou o seu problema? Podemos fechar o chamado?
No aguardo.
GOSTEI 0
Luiz Maia

Luiz Maia

24/03/2009

Indemberg,   Como não recebemos nenhum retorno do seu chamado, estamos concluindo o mesmo. Continuamos a sua disposição para eventuais duvidas.   Abraços Att Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

24/03/2009

Prezados;   Estes últimos dias estão sendo um pouco corrido, estou terminando outro trabalho, e além disso estou com um problema na conexão de internet da empresa que trabalho e devido a isto não consigo conectar o sistema de consultoria.   Aparentemente, a solução proposta me atende, falta apenas eu concluir a rotina, devo fazer isso por esses dias, quando concluir entro em contato.   Muito obrigado pela atenção!   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

24/03/2009

Ok Inderberg, não se preocupe com tempo. Estamos a sua disposição. E aguardamos novos contatos.   Abraços Att Luiz Maia
GOSTEI 0
POSTAR