Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

Chamuanza

Actualizar DatagridView após introduzir novo registo

Mensagens Recomendadas

Chamuanza    2
Chamuanza

Um Bem Aja a Todos

Estou com dificuldade em actualizar (ver o registo introduzido na Datagrid) após a introdução do mesmo, ou seja só vejo o novo registo se sair da Form onde está a Datagrid e voltar a entrar

Este é o codigo que utilizo para introduzir novo registo

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        ' Dim ConnectionString As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\ChamuanzasNet.mdb")

        Dim ConnectionString As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & My.Application.Info.DirectoryPath & "\ChamuanzasNet.mdb")


        Dim query As String = "INSERT INTO ListaChamuanzas([id], [Nome], [Morada], [Apelido], [Localidade], [Cidade], [CodigoPostal], [Telefone], [Telemovel], [idaUltramar], [RegressoUltramar], [Email], [Especialidade]) VALUES (@Id, @Nome, @Morada, @Apelido, @Localidade, @Cidade, @CodigoPostal, @Telefone, @Telemovel, @IdaUltramar, @RegressoUltramar, @Email, @Especialidade)"


        Dim command As New OleDbCommand(query, ConnectionString)
        command.Parameters.Add("@Id", OleDbType.Numeric).Value = txtId.Text
        command.Parameters.Add("@Nome", OleDbType.VarChar).Value = txtNome.Text
        command.Parameters.Add("@Morada", OleDbType.VarChar).Value = txtMorada.Text
        command.Parameters.Add("@Apelido", OleDbType.VarChar).Value = txtApelido.Text
        command.Parameters.Add("@Localidade", OleDbType.VarChar).Value = txtLocalidade.Text
        command.Parameters.Add("@Cidade", OleDbType.VarChar).Value = txtCidade.Text
        command.Parameters.Add("@CodigoPostal", OleDbType.VarChar).Value = txtCodigoPostal.Text
        command.Parameters.Add("@Telefone", OleDbType.VarChar).Value = txtTelefone.Text
        command.Parameters.Add("@Telemovel", OleDbType.VarChar).Value = txtTelemovel.Text
        command.Parameters.Add("@IdaUltramar", OleDbType.VarChar).Value = txtIdaUltramar.Text
        command.Parameters.Add("@RegressoUltramar", OleDbType.VarChar).Value = txtRegressoUltramar.Text
        command.Parameters.Add("@Email", OleDbType.VarChar).Value = txtEmail.Text
        command.Parameters.Add("@Especialidade", OleDbType.VarChar).Value = txtEspecialidade.Text


        ConnectionString.Open()

        Dim x As Integer = command.ExecuteNonQuery()

        If x < 1 Then
            MessageBox.Show("Erro ao inserir", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
        Else
            MessageBox.Show("Registo inserido com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If

        ConnectionString.Close()

        command = Nothing


        frmListagemChamuanzas.DataGridView1.Rows(frmListagemChamuanzas.DataGridView1.Rows.GetFirstRow(DataGridViewElementStates.Visible)).Cells(0).Selected = True

        ' frmListagemChamuanzas.DataGridView1.Rows(frmListagemChamuanzas.DataGridView1.Rows.GetLastRow(DataGridViewElementStates.Visible)).Cells(0).Selected = True


        'Depois de Adicionar o registo Vai para a ultima linha da Datagrid
        Dim NumeroLinhas As Integer = frmListagemChamuanzas.DataGridView1.Rows.Count - 1

        frmListagemChamuanzas.DataGridView1.CurrentCell = frmListagemChamuanzas.DataGridView1.Item(0, NumeroLinhas - 1)
        frmListagemChamuanzas.DataGridView1.CurrentCell.Selected = False

        Me.Close()

Obrigado desde já pela atenção

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Chamuanza    2
Chamuanza

Oi Caça

No código acima a seguir ao close da Connection    coloquei

frmListagemChamuanzas.DataGridView1.Rows.Add()

mas da-me o erro:

Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    170
bioshock

Isso significa que ela já tem o DataSource embutido, o que é normal. Porque não chamas novamente a função que carrega os dados?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Chamuanza    2
Chamuanza

Já tentei com

Private Sub frmListagemChamuanzas_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'ChamuanzasNetDataSet.ListaChamuanzas' table. You can move, or remove it, as needed.
        Me.ListaChamuanzasTableAdapter.Fill(Me.ChamuanzasNetDataSet.ListaChamuanzas)

mas não sei em que evento devo por

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Chamuanza    2
Chamuanza

Optei por recarregar a Datagrid com

 Dim ConnectionString As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & My.Application.Info.DirectoryPath & "\ChamuanzasNet.mdb")


        Dim query As String = "SELECT * FROM ListaChamuanzas"

        Dim DataAdapter As New OleDbDataAdapter(query, ConnectionString)
        Dim MyData As New DataSet
        DataAdapter.Fill(MyData, "ListaChamuanzas")

        Me.DataGridView1.DataSource = MyData.Tables("ListaChamuanzas")

mas vai-me interferir com o codigo assinalado que tenho no evento

 Private Sub DataGridView1_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellChanged

        Dim Linha As String

        Linha = ""

        'Linha = DataGridView1.Rows(e.RowIndex).Cells(0).Value

      [b]  'Vai buscar o valor de ID da linha assinalada
     Linha = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value


        If My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".bmp") And My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".jpg") Then

            'Se existe, a imagem BMP e JPG carrega
            Me.PictureBox1.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\" & Linha & ".bmp")
            Me.PictureBox2.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\" & Linha & ".jpg")
            Label1.Visible = True
            Label2.Visible = True

            'Vai buscar o valor de ID da linha assinalada
            TextBox1.Text = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value

        ElseIf My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".bmp") And Not My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".jpg") Then

            'Se existe a imagem BMP, mas não existe a JPG carrega a imagem BMP e o Simbolo
            Me.PictureBox1.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\" & Linha & ".bmp")
            Me.PictureBox2.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\Simbolo.jpg")
            Label1.Visible = True
            Label2.Visible = False

            'Vai buscar o valor de ID da linha assinalada
            TextBox1.Text = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value

        ElseIf Not My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".bmp") And My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".jpg") Then

            'Se existe a imagem JPG, mas não existe a imagem BMP carrega a imagem JPG e o Simbolo
            Me.PictureBox1.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\Simbolo.bmp")
            Me.PictureBox2.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\" & Linha & ".jpg")

            Label1.Visible = False
            Label2.Visible = True

            'Vai buscar o valor de ID da linha assinalada
            TextBox1.Text = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value

        Else
            'Se não existe imagem BMP nem imagem JPG carrega os dois simbolos
            Me.PictureBox1.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\Simbolo.bmp")
            Me.PictureBox2.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\Simbolo.bmp")

            DataGridView1.CurrentRow.Selected = False

            Label1.Visible = False
            Label2.Visible = False

            'Vai buscar o valor de ID da linha assinalada
            TextBox1.Text = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value
            Exit Sub
        End If

        'butSair.Focus()

    End Sub

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Chamuanza    2
Chamuanza

Mas eu quero que o código em questão seja executado, pois vai mostrar a imagem correspondente ao registo apontado nesta caso o ultimo registo

Sendo assim como dou a volta a situação?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Chamuanza    2
Chamuanza

Quando faço um novo registo ou apago um registo depois de mandar recarregar a Datagrid nesta rotina a linha marcada a azul  um erro "Object reference not set to an instance of an object."

'Vai buscar o valor de ID da linha assinalada

    Linha = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value

 Private Sub DataGridView1_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellChanged



        Dim Linha As String

        Linha = ""

      
        'Vai buscar o valor de ID da linha assinalada
     [u]Linha = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value[/u]


        If My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".bmp") And My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".jpg") Then

            'Se existe, a imagem BMP e JPG carrega
            Me.PictureBox1.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\" & Linha & ".bmp")
            Me.PictureBox2.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\" & Linha & ".jpg")
            Label1.Visible = True
            Label2.Visible = True

            'Vai buscar o valor de ID da linha assinalada
            TextBox1.Text = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value

        ElseIf My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".bmp") And Not My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".jpg") Then

            'Se existe a imagem BMP, mas não existe a JPG carrega a imagem BMP e o Simbolo
            Me.PictureBox1.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\" & Linha & ".bmp")
            Me.PictureBox2.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\Simbolo.jpg")
            Label1.Visible = True
            Label2.Visible = False

            'Vai buscar o valor de ID da linha assinalada
            TextBox1.Text = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value

        ElseIf Not My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".bmp") And My.Computer.FileSystem.FileExists("D:\ChamuanzasNet\Imagens\" & Linha & ".jpg") Then

            'Se existe a imagem JPG, mas não existe a imagem BMP carrega a imagem JPG e o Simbolo
            Me.PictureBox1.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\Simbolo.bmp")
            Me.PictureBox2.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\" & Linha & ".jpg")

            Label1.Visible = False
            Label2.Visible = True

            'Vai buscar o valor de ID da linha assinalada
            TextBox1.Text = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value

        Else
            'Se não existe imagem BMP nem imagem JPG carrega os dois simbolos
            Me.PictureBox1.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\Simbolo.bmp")
            Me.PictureBox2.Image = System.Drawing.Image.FromFile("D:\ChamuanzasNet\Imagens\Simbolo.bmp")

            'DataGridView1.CurrentRow.Selected = False

            Label1.Visible = False
            Label2.Visible = False

            'Vai buscar o valor de ID da linha assinalada
            TextBox1.Text = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value
            Exit Sub
        End If



    End Sub

    Private Sub CarregarDataGrid()

        Dim ConnectionString As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & My.Application.Info.DirectoryPath & "\ChamuanzasNet.mdb")


        Dim query As String = "SELECT * FROM ListaChamuanzas Order By Id"

        Dim DataAdapter As New OleDbDataAdapter(query, ConnectionString)
        Dim MyData As New DataSet
        DataAdapter.Fill(MyData, "ListaChamuanzas")

        Me.DataGridView1.DataSource = MyData.Tables("ListaChamuanzas")

        'Depois de Adicionar o registo Vai para a ultima linha da Datagrid
        Dim NumeroLinhas As Integer = Me.DataGridView1.Rows.Count - 1

        Me.DataGridView1.CurrentCell = Me.DataGridView1.Item(0, NumeroLinhas - 1)
        Me.DataGridView1.CurrentCell.Selected = False

    End Sub

Object reference not set to an instance of an object.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
DevilRocks92    0
DevilRocks92

Cria um sub "lista_log" com o codigo onde inseres os dados na datagridview.

Depois num botao "Actualizar" escreves lista_log (nome do sub).

Ve se consegues...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Chamuanza    2
Chamuanza

Ola Devil será isto a que te referes?

Mas deve faltar aqui algo

 Private Sub Lista_log()

        Dim ConnectionString As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & My.Application.Info.DirectoryPath & "\ChamuanzasNet.mdb")


        Dim query As String = "SELECT * FROM ListaChamuanzas Order By Id"

        Dim DataAdapter As New OleDbDataAdapter(query, ConnectionString)
        Dim MyData As New DataSet
        DataAdapter.Fill(MyData, "ListaChamuanzas")

        Me.DataGridView1.DataSource = MyData.Tables("ListaChamuanzas")

        'Depois de Adicionar o registo Vai para a ultima linha da Datagrid
        Dim NumeroLinhas As Integer = Me.DataGridView1.Rows.Count - 1

        Me.DataGridView1.CurrentCell = Me.DataGridView1.Item(0, NumeroLinhas - 1)
        Me.DataGridView1.CurrentCell.Selected = False

    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      
  Lista_log()

    End Sub

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Chamuanza    2
Chamuanza

Ok embora não entenda o que queres dizer com abrir a BD pela pasta Bin\debug ( correr o executavel que está na pasta?)

mas diz-me o que deveria  ocorrer com a acção, para eu tentar perceber

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    170
bioshock

No código que mostraste anteriormente tens a seguinte linha de código:

Dim ConnectionString As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & My.Application.Info.DirectoryPath & "\ChamuanzasNet.mdb")

Ora isto significa que tens a base de dados alojada em que pasta especificamente? Projecto\bin\debug\ChamuanzasNet.mdb

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Chamuanza    2
Chamuanza

Ola Bioshock

Ainda bem que te referes ao alojamento da BD

Desde cedo que ando as voltas com uma situação que descortinei comecei a reparar que me aparecia registos duplicados na BD alojada na pasta bin\debug

Mas tenho tambem a mesma (pensava eu) BD na pasta de raiz do projecto

Então no mesmo projecto existem 2 BD ? :wallbash:

E quando apago ou introduzo um registo, ficam as duas BD actualizadas?

Isto é assim mesmo ou está aqui um caldinho feito por um maçarico

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    170
bioshock

O que eu te estou a dizer é que deves escolher uma das duas formas de trabalhar no projecto. Se importares a base de dados para o projecto não interessa onde a tens, isso assume logo. Se não importares a base de dados, então terás sempre de fazer referência a ela (como tens feito).

O que está aqui em causa é que estás a utilizar dois métodos distintos para fazer a mesma coisa no projecto, como te disse no último post. Deves escolher um dos métodos, porque se não vai dar uma salgalhada.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    170
bioshock

Se tiveres problemas com qualquer código que daí advenha volta cá, mas primeiro procura pelo fórum ou na própria wiki se tem informação :thumbsup:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade