Carcleo 4 Denunciar post Postado Novembro 1, 2008 Ola pessoal. Peguei o tutorial que esta em http://www.macoratti.net/08/06/vbn_psv2.htm, e resolvi colocar o form de pesquisa que la esta no formulario de cadastro de clientes. Meu código abaixo, faz a filtragem normal e exibe no gridview normal mas na hora que eu vou selecionar o registro no grid e entregar ao formulario, simplesmente não funciona. O que será que esta faltando? Meu código: Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged Try Dim sql As String = "Select * from " & tabela & " where Nome like '" & P_Nome.Text & "%'" ds = accDb.ExecuteDS(sql, tabela) DGWClientes.DataSource = ds.Tables(0).DefaultView Catch ex As Exception MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End Try End Sub Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click Dim linha As Integer = DGWClientes.CurrentRow.Index 'Obtem o elemento da coluna ClienteID Dim P_Codigo As String = DGWClientes.Item("ClienteID", linha).Value.ToString 'Definimos como OK o resultado da janela de diálogo Me.DialogResult = System.Windows.Forms.DialogResult.OK End Sub Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Novembro 1, 2008 Esse eu ja matei mas agora deu um problema. No código quie puz para resolver este problema, tem um linha que me retorna o valor do clienteID que esta na tabela do banco de dados. O problema é que não esta me retornando o valor do clienteID mas sim quantos resultados foram aferidos na consulta exposta no grid. Por exemplo: No grid sairam os id's: 01, 02, 03 e 05 Caso eu selecione no grid o id 05, o código abaixo esta me retornando 04 pois é o 04 registro a ser listado no grid. Como resolvo isso? Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged Try Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'" ds = accDb.ExecuteDS(sql, tabela) DGWClientes.DataSource = ds.Tables(0).DefaultView Catch ex As Exception MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End Try End Sub Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click Dim linha As Integer = DGWClientes.CurrentRow.Index 'Obtem o elemento da coluna ClienteID registro = DGWClientes.Item("clienteID", linha).Value - 1 exibirDados(registro) End Sub Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Novembro 2, 2008 Ja que ninhguem ainda respondeu, vou tentar ser mais específico. Normalmente, a gente faz um formulario para cadastro de clientes e nele, um botão localizar que abre outro formulario para pesquiza de clientes certo? Nesse formulario de pesquisa, quando selecionamos no gridview o cliente que queremos e clikamos no botão selecionar, a rotina pega o id desse cliente, fecha o form de pesquisa e exibe os dados do cliente selecionado no form de cadastro de clientes. Certo? Pois bem. Eu resolvi, em vez de criar um form separado para pesquisa, criar um panel no proprio form de cadastro de clientes. Tudo ocorre normalmente, exceto um coisa: Após a pesquisa entrgar os dados do cliente escolhido para o form de cadastro, caso eu clique no botão alterar do form para alterar o registro vindo da parte da pesquisa, caso o registro anterior tenha sido excluido, a rotina diz que o registro anterior não existe. Porem, isso só acontece com no caso da ediçao com registros que vem do form de pesquisa. Caso eu navegue pelos botões, proximo anterior... até esse mesmo registro, aí não da erro. Exemplo: registro na tabela: clientes exibidos: 01, 02, 03 e 05 (o 04 foi deletado) Se eu escolher os clientes de 01 a 03 no form de pesquisa, a edição funciona normal. Mas, se escolher o 05, ai ele diz que não existe registro na posição 04. Mas, isso só acontece quan do o registro é alterado vin do do form de pesquisa. O que pode estar errado? Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Novembro 2, 2008 pessoal, matei mais essa ficou assim:> Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged Try Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'" ds = accDb.ExecuteDS(sql, tabela) DGWClientes.DataSource = ds.Tables(0).DefaultView Catch ex As Exception MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End Try End Sub Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click Dim linha As Integer = DGWClientes.CurrentRow.Index 'Obtem o elemento da coluna ClienteID registro = DGWClientes.Item("ClienteID", linha).Value.ToString - 1 Dim i As Integer = dt.Rows.Count - 1 If registro > i Then registro = i exibirDados(registro) End Sub Agora. Poque coloco nas propriedades do form para ele abrir maximizado e ele n ão abre? Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Novembro 3, 2008 Ola Pessoal. Sou iniciante em .Net e to precisando de uma luz tua ai fazendo um favor: Peguei teu tuto http://www.macoratti.net/08/05/vbn8_psv.htm. Normalmente, a gente faz um formulário para cadastro de clientes e nele, um botão localizar que abre outro formulário para pesquisa(como você fez no tuto) de clientes certo? Nesse formulário de pesquisa, quando selecionamos no gridview o cliente que queremos e clikamos no botão selecionar, a rotina pega o id desse cliente, fecha o form de pesquisa e exibe os dados do cliente selecionado no form de cadastro de clientes. Certo? Pois bem. Eu resolvi, em vez de criar um form separado para pesquisa, criar um panel no próprio form de cadastro de clientes. Tudo ocorre normalmente, exceto um coisa: Após a pesquisa entregar os dados do cliente escolhido para o form de cadastro, caso eu clique no botão alterar do form para alterar o registro vindo da parte da pesquisa, caso o registro anterior tenha sido excluído, a rotina diz que o registro anterior não existe. Daí tentei pegar pelo posição do registro mas não deu também pois essa posição não é a do cadastro e sim da pesquisa. No mnomento em que eu faço o filtro no textbox ai o registro toma outra posição. Porem, isso só acontece com no caso da edição com registros que vem do form de pesquisa. Caso eu navegue pelos botões, próximo anterior... até esse mesmo registro, aí não da erro. Exemplo: registro na tabela: clientes exibidos: 01, 02, 03 e 05 (o 04 foi deletado) Se eu escolher os clientes de 01 a 03 no form de pesquisa, a edição funciona normal. Mas, se escolher o 05, ai ele diz que não existe registro na posição 04. Mas, isso só acontece quando o registro é alterado vindo do form de pesquisa. O que pode estar errado? O foco é na ultima parte La embaixo onde ta assim: Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged Try Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'" ds = accDb.ExecuteDS(sql, tabela) DGWClientes.DataSource = ds.Tables(0).DefaultView Catch ex As Exception MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End Try End Sub Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click registro = DGWClientes.CurrentRow.Index exibirDados(registro) End SubBom, segue meu código completo: Imports MySql.Data.MySqlClient Public Class Clientes Dim accDb As New DBConnection Dim registro As Integer Dim dr As DataRow Dim dt As DataTable Dim ds As DataSet = Nothing Dim tabela As String = "Clientes" Public Sub habilita() For Each c As Control In Me.grpClientes.Controls If TypeOf c Is TextBox Then c.Enabled = True End If Next End Sub Public Sub desabilita() For Each c As Control In Me.grpClientes.Controls If TypeOf c Is TextBox Then c.Enabled = False End If Next End Sub Private Sub atribuirDados(ByVal dr As DataRow) dr("clienteID") = Codigo.Text dr("nome") = Nome.Text dr("endereco") = Endereco.Text dr("email") = Email.Text End Sub Private Sub exibirDados(ByVal m As Integer) Dim i As Integer = dt.Rows.Count - 1 If m < 0 OrElse i < 0 Then Exit Sub Dim dr As DataRow = dt.Rows(m) Codigo.Text = dr("clienteID") Nome.Text = dr("nome") Endereco.Text = dr("endereco") Email.Text = dr("email") End Sub Private Sub Clientes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try Dim sql As String = "Select * from " & tabela & " where ativo='S'" ds = accDb.ExecuteDS(sql, tabela) dt = ds.Tables(tabela) DGWClientes.DataSource = ds.Tables(0).DefaultView registro = dt.Rows.Count - 1 exibirDados(registro) desabilita() If dt.Rows.Count = 0 Then Primeiro.Enabled = False Anterior.Enabled = False Proximo.Enabled = False Ultimo.Enabled = False Atualizar.Enabled = False Eliminar.Enabled = False Pesquisar.Enabled = False End If If dt.Rows.Count > 0 Then registro = 0 Primeiro_Click(Nothing, Nothing) Else registro = -1 End If Catch ex As Exception MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End Try End Sub Private Sub Primeiro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Primeiro.Click registro = 0 exibirDados(registro) End Sub Private Sub Anterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Anterior.Click registro = registro - 1 If registro < 0 Then registro = 0 exibirDados(registro) End Sub Private Sub Proximo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Proximo.Click Dim i As Integer = dt.Rows.Count - 1 registro = registro + 1 If registro > i Then registro = i exibirDados(registro) End Sub Private Sub Ultimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Ultimo.Click registro = dt.Rows.Count - 1 exibirDados(registro) End Sub Private Sub Novo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Novo.Click If Novo.Text = "Novo" Then For Each c As Control In Me.grpClientes.Controls If TypeOf c Is TextBox Then c.Text = "" End If Next Atualizar.Enabled = False Eliminar.Enabled = False Encerrar.Text = "Cancela" Novo.Text = "Incluir" habilita() Nome.Focus() Codigo.Enabled = False ElseIf Novo.Text = "Incluir" Then dr = dt.NewRow incluirRegistro(dr) Novo.Text = "Novo" Encerrar.Text = "Encerrar" Atualizar.Enabled = True Eliminar.Enabled = True desabilita() End If End Sub Private Sub incluirRegistro(ByVal dr As DataRow) Dim sql As String = "INSERT INTO " & tabela & " (nome,endereco,email,ativo)VALUES ('" & Nome.Text & "','" & Endereco.Text & "','" & Email.Text & "','S')" ds = accDb.ExecuteDS(sql, tabela) Try MessageBox.Show("registro de Usuário incluido com sucesso.") exibirDados(registro) Catch ex As Exception MessageBox.Show("Erro ao efetuar a conexão com a base de dados : " + ex.Message) End Try End Sub Private Sub Clientes_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress 'permitir que a mudança de um campo para outro do formulário seja possível com o pressionamento da tecla ENTER If e.KeyChar = Convert.ToChar(13) Then e.Handled = True SendKeys.Send("{TAB}") End If End Sub Private Sub Atualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Atualizar.Click If Atualizar.Text = "Atualizar" Then registro = registro Novo.Enabled = False Eliminar.Enabled = False Encerrar.Text = "Cancela" Atualizar.Text = "Salvar Alteração" Nome.Focus() habilita() Codigo.Enabled = False ElseIf Atualizar.Text = "Salvar Alteração" Then Dim kk As String = registro Codigo.Enabled = False If registro < 0 OrElse registro > dt.Rows.Count - 1 Then Exit Sub dr = dt.Rows(registro) atualizarRegistro(dr) Atualizar.Text = "Atualizar" Encerrar.Text = "Encerrar" Novo.Enabled = True Eliminar.Enabled = True desabilita() End If End Sub Private Sub atualizarRegistro(ByVal dr As DataRow) atribuirDados(dr) Dim kk As String = registro Dim sql As String = "UPDATE " & tabela & " SET nome = '" & Nome.Text & "',endereco= '" & Endereco.Text & "',email = '" & Email.Text & "' where clienteID='" & dr("clienteID") & "'" ds = accDb.ExecuteDS(sql, tabela) exibirDados(registro) Try MessageBox.Show("registro de Usuário alterado com sucesso.") Catch ex As Exception MessageBox.Show("Erro ao efetuar a conexão com a base de dados : " + ex.Message) End Try End Sub Private Sub Eliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Eliminar.Click If registro < 0 OrElse registro > dt.Rows.Count - 1 Then Exit Sub Else If MessageBox.Show("Deseja Excluir esse registro", "Excluir", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then Dim codigo As Integer Dim dr As DataRow = dt.Rows(registro) codigo = dr("clienteID") codigo = CType(codigo.ToString, Integer) eliminarRegistro(codigo) End If End If End Sub Private Sub eliminarRegistro(ByVal codigo As Integer) Dim sql As String = "UPDATE " & tabela & " SET ativo = 'N' where clienteID = " & codigo ds = accDb.ExecuteDS(sql, tabela) Proximo_Click(Nothing, Nothing) Try MessageBox.Show("registro de Usuário excluido com sucesso.") Catch ex As Exception MessageBox.Show("Erro ao efetuar a conexão com a base de dados : " + ex.Message) End Try End Sub Private Sub Encerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Encerrar.Click If Encerrar.Text = "Encerrar" Then If MessageBox.Show("Deseja encerrar a aplicação", "Encerrar", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then If ds.HasChanges Then ds.AcceptChanges() End If Me.Close() End If ElseIf Encerrar.Text = "Cancela" Then desabilita() Encerrar.Text = "Encerrar" Atualizar.Enabled = True Eliminar.Enabled = True Novo.Text = "Novo" Novo.Enabled = True Atualizar.Text = "Atualizar" Anterior_Click(Nothing, Nothing) End If End Sub Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged Try Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'" ds = accDb.ExecuteDS(sql, tabela) DGWClientes.DataSource = ds.Tables(0).DefaultView Catch ex As Exception MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End Try End Sub Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click registro = DGWClientes.CurrentRow.Index exibirDados(registro) End Sub End Class Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Novembro 3, 2008 Mas você não deve passar o indice do seu registro. Você deve passar a chave primária do seu registro. Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Novembro 3, 2008 Eu sei. O problema todo é que na pesquiza eu faço a seguinte query: Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'"Que a cada letra digitada, retorna(com filtro) um novo resultado na gridview.Porem, quando a chave chega la na função mostrar dados (registo), la, o ponteiro da query da pesquiza não confere com o ponteiro da query do load do formulario e ai da que não ha registro na posição tal. Colocando como chave primaria, quando chega a chave primaria la na função de mostrar dados, a função fica procurando ponteiro da query do load com o valorr da chave primaria e não pela chave. segue o link dos arquivos em .zip. por favor. baixe e de uma olhadinha fazendo favor http://www.carcleo.com/vendas.zip Função mostradados() Private Sub exibirDados(ByVal m As Integer) Dim i As Integer = dt.Rows.Count - 1 If m < 0 OrElse i < 0 Then Exit Sub Dim dr As DataRow = dt.Rows(m) Codigo.Text = dr("clienteID") Nome.Text = dr("nome") Endereco.Text = dr("endereco") Email.Text = dr("email") End Sub codigo da chamada: Private Sub P_Nome_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles P_Nome.TextChanged Try Dim sql As String = "Select * from " & tabela & " where ativo='S' and nome like '" & P_Nome.Text & "%'" ds = accDb.ExecuteDS(sql, tabela) DGWClientes.DataSource = ds.Tables(0).DefaultView Catch ex As Exception MessageBox.Show("Erro: " & ex.Message, "Sem conexão", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End Try End Sub Private Sub Selecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Selecionar.Click 'Dim linha As Integer = DGWClientes.CurrentRow.Index 'registro = DGWClientes.Item("clienteID", linha).Value.ToString registro = DGWClientes.CurrentRow.Index exibirDados(registro) End Sub mas quando chega na operação de editar ai da o erro: Private Sub Atualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Atualizar.Click If Atualizar.Text = "Atualizar" Then Novo.Enabled = False Eliminar.Enabled = False Encerrar.Text = "Cancela" Atualizar.Text = "Salvar Alteração" Nome.Focus() habilita() Codigo.Enabled = False ElseIf Atualizar.Text = "Salvar Alteração" Then Dim kk As String = registro Codigo.Enabled = False If registro < 0 OrElse registro > dt.Rows.Count - 1 Then Exit Sub dr = dt.Rows(registro) atualizarRegistro(dr) Atualizar.Text = "Atualizar" Encerrar.Text = "Encerrar" Novo.Enabled = True Eliminar.Enabled = True desabilita() End If End Sub Private Sub atualizarRegistro(ByVal dr As DataRow) atribuirDados(dr) Dim kk As String = registro Dim sql As String = "UPDATE " & tabela & " SET nome = '" & Nome.Text & "',endereco= '" & Endereco.Text & "',email = '" & Email.Text & "' where clienteID='" & dr("clienteID") & "'" ds = accDb.ExecuteDS(sql, tabela) exibirDados(registro) Try MessageBox.Show("registro de Usuário alterado com sucesso.") Catch ex As Exception MessageBox.Show("Erro ao efetuar a conexão com a base de dados : " + ex.Message) End Try End Sub Compartilhar este post Link para o post Compartilhar em outros sites