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

bioshock

Checkboxs em DGrid {resolvido}

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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  ;)

Partilhar esta mensagem


Ligação 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 os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.