Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

bioshock

Checkboxs em DGrid {resolvido}

Recommended Posts

bioshock

Boas,

Há uns tempos criei um tópico semelhante, contudo achei uma forma de por a funcionar umas checkboxs na Datagrid. Mas recentemente tenho tido aqui uns problemas e já não sei para onde me virar, deixo aqui o Full código para uma melhor percepção do que se passa:

        If ComboBox1.SelectedIndex = 2 Then
            ' Selecciona a Base de dados;
            Dim BaseDeDados As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & My.Application.Info.DirectoryPath & "\BD.mdb';Persist Security Info=True;"
            ' Vamos fazer um ciclo para a selecção da checkbox;
            For n = 0 To DataGridView1.Rows.Count - 1
                ' Caso não tenha nenhuma checkbox checkada..;
                If DataGridView1.Rows(n).Cells(0).Value = False Then
                    ' Aparece uma msg e fechamos o ciclo;
                    MessageBox.Show("Seleccione um registo primeiro.", "Seleccione Registo", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    Exit Sub
                    ' Caso esteja uma checkbox checkada..;
                Else
                    ' Aparece uma msgbox a perguntar se deseja eliminar os registos..;
                    If MessageBox.Show("Tem a certeza que deseja eliminar os registos", "Eliminar Registos", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.OK Then
                        ' Se clicarmos no OK, então:
                        ' Guardamos na variável PegaIDUtilizador o ID de quem foi seleccionado;
                        PegaIDUtilizador = DataGridView1.Rows(n).Cells(1).Value
                        ' Eliminamos da tabela TLogin os ID's registados na variável PegaIDUtilizador;
                        Dim query As String = "DELETE FROM TableUsers WHERE User = " & PegaIDUtilizador & ""
                        ' Cria a connexão com a Base de dados;
                        Dim connection As New OleDbConnection(BaseDeDados)
                        ' Especifica quais as informações a serem digitadas nos campos da base de dados;
                        Dim command As New OleDbCommand(query, connection)
                        ' Abre a connexão;
                        connection.Open()
                        ' Guarda em X o número de registos inseridos;
                        Dim x As Integer = command.ExecuteNonQuery()
                        ' Fecha a ligação e limpa as variáveis 
                        connection.Close()
                        connection = Nothing
                        command = Nothing
                        MessageBox.Show("Os registos foram eliminados com sucesso!", "Registos eliminados", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        'MostraDG
                        ' Caso cliquemos em CANCELAR;
                    Else
                        ' Saímos do ciclo;
                        Exit Sub
                    End If
                End If
            Next
        End If

Heis os problemas:

1. Nesta linha de código:

                ' Caso não tenha nenhuma checkbox checkada..;
                If DataGridView1.Rows(n).Cells(0).Value = False Then
                    ' Aparece uma msg e fechamos o ciclo;
                    MessageBox.Show("Seleccione um registo primeiro.", "Seleccione Registo", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    Exit Sub

Se eu seleccionar qualquer célula sem ser a 1ª ele aparece sempre essa mensagem (Por causa do ciclo For: (For n = 0 )) de que forma posso melhorar isto? Pensei em algo como substituir:

DataGridView1.Rows(n).Cells(0).Value = False

Por:

DataGridView1.Rows(n).Cells(n).Value = False

Mas sem sucesso.

2. Quando selecciono dois registos (por exemplo) consigo eliminar com sucesso os registos, mas aparece-me duas vezes a mesma mensagem a perguntar se quero eliminar o registo. Pensei então em por após a MessageBox "Os registos foram eliminados com sucesso.." um Exit Sub, mas assim ele elimina só o 1º registo por causa desta linha de código:

PegaIDUtilizador = DataGridView1.Rows(n).Cells(1).Value

  :wallbash:

Obrigado pessoal  :D

Share this post


Link to post
Share on other sites
Tuntankamon

Isto está um bocado confuso para mim...

Mas o que é suposto fazer é eliminar os registos que estejam seleccionados com a checkbox?

Parece-me que isto é capaz de fazer o trabalho:

Dim listaItems As New List(Of Integer)

        For Each item As DataGridViewRow In datagridview1.Rows
            If item.Cells(0).Value = False Then Continue For
            listaItems.Add(item.Cells(1).Value)
        Next


        If listaItems.Count = 0 Then
            MsgBox("Não tem registos para remover!")
        Else
            If MsgBox("O(s) registo(s) seleccionado(s) irão ser removidos, tem a certeza?", MsgBoxStyle.Question Or MsgBoxStyle.YesNo) = MsgBoxResult.No Then Exit Sub
            Dim query As String = "DELETE FROM TableUsers WHERE User = @ID"
            Dim connection As New OleDbConnection(BaseDeDados)
            Dim command As New OleDbCommand(query, connection)

            Try
                connection.Open()
                For Each id As Integer In listaItems
                    command.Parameters.Clear()
                    command.Parameters.AddWithValue("@ID", id)
                    If command.ExecuteNonQuery <> 1 Then
                        MsgBox("Erro ao tentar remover registo!", MsgBoxStyle.Exclamation)
                        Exit Sub
                    End If
                Next
                MsgBox("Registos removidos com sucesso!", MsgBoxStyle.Information)
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Exclamation)
            Finally
                connection.Close()
            End Try
        End If

Como é óbvio não pude testar... mas se houver algum problema, é só expor.

Share this post


Link to post
Share on other sites
bioshock

São coisas  do catano.

Hoje, na aula, achei a solução (creio) e está algo semelhante ao código que deste.

Mas assim que testar melhor dou uma apitadela. Obrigado!

Share this post


Link to post
Share on other sites
bioshock

Tive que fazer umas pequenas adaptações, mas nada de importante. Era como eu tinha pensado, mas tu ainda pensaste melhor em relação ao:

Dim listaItems As New List(Of Integer)

Obrigado r00tfixxxer  ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.