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

Chamuanza

Procura Continua em DataGrid

13 mensagens neste tópico

Oi Pessoal um bem aja a todos

Tenho este código que me faz uma busca em coluna de datagrid.

Com uma dica que o JPaulino me deu consigo apanhar a primeira linha da busca e a segunda linha, depois o ponteiro salta de novo para a primeira linha quando devia posicionar-se na linha seguinte da busca (pois existe).

Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click

        Dim texto As String = Nothing


        If ToolStripTextBox1.Text <> String.Empty Then
            'percorre cada linha do DataGridView
            For Each linha As DataGridViewRow In PrincipalDataGridView.Rows
                'percorre cada célula da linha
                For Each celula As DataGridViewCell In PrincipalDataGridView.Rows(linha.Index).Cells
                    'se a coluna for a coluna 2 (Designação) então verifica o criterio
                    If celula.ColumnIndex = 2 Then
                        texto = celula.Value.ToString.ToLower
                        'se o texto informado estiver contido na célula então seleciona toda linha


                        If texto.Contains(ToolStripTextBox1.Text.ToLower) And UltimaBusca <> linha.Index Then

                            UltimaBusca = linha.Index

                            'seleciona a linha
                            Me.PrincipalDataGridView.Rows(celula.RowIndex).Selected = True

                            'faz da seleção a linha currente
                            Me.PrincipalDataGridView.CurrentCell = celula

                            Exit Sub



                        End If
                    End If
                Next
            Next
        End If

    End Sub

Um Obrigado desde já pela atenção

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já exprimentaste um step-debug para ver o que se está a passar?

Assim de repente, está me a querer parecer que o Exit Sub é corrido sempre que se encontra um valor. É suposto parar tudo sempre que se encontra um valor?

Entendo o que quiseste fazer com o "UltimaBusca", mas usa o step-debug para poderes VER as coisas a acontecer.

EDIT: Para a próxima, quando usas o botão "code", acrescenta no tag "=vbnet" :confused::

[c o d e = v b n e t ]da da da[ / c o d e]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se eu retirar o Exit Sub a linha não é seleccionada pois aparece um erro de

"Object reference not set to an instance of an object." na linha

texto = celula.Value.ToString.ToLower

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi Ribeiro55

Alterei o sinal de <> para < e o ponteiro já salta até ao ultimo elememto de busca, no entanto se procuro para alem do ultimo elemento apresenta o mesmo  erro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque fazes um ciclo em todas as células se só vais ler a uma ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aproveitei esta rotina de um forum salvo erro do Macoratti, e tentei a alteração, essa questão é bem colocada, mas como dou a voltaa situação?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Presumo que a variável UltimaLinha esteja declarada fora do SUB e com valor inicial = 0, algo deste estilo:

Dim UltimaLinha As Integer = 0

Depois o código terá de ficar algo deste género (não testado)

Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click

        Dim texto As String = Nothing


        If ToolStripTextBox1.Text <> String.Empty Then
            'percorre cada linha do DataGridView
            For i As Integer = UltimaBusca To PrincipalDataGridView.Rows.Count
                'percorre cada célula da linha
                For Each celula As DataGridViewCell In PrincipalDataGridView.Rows(i).Cells
                    'se a coluna for a coluna 2 (Designação) então verifica o criterio
                    If celula.ColumnIndex = 2 Then
                        texto = celula.Value.ToString.ToLower
                        'se o texto informado estiver contido na célula então seleciona toda linha


                        If texto.Contains(ToolStripTextBox1.Text.ToLower) And UltimaBusca <> linha.Index Then

                            UltimaBusca = linha.Index

                            'seleciona a linha
                            Me.PrincipalDataGridView.Rows(celula.RowIndex).Selected = True

                            'faz da seleção a linha currente
                            Me.PrincipalDataGridView.CurrentCell = celula

                            Exit Sub



                        End If
                    End If
                Next
            Next
        End If

    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi amigo Weasel

agora que cheguei do trabalho estou a testar o codigo que enviaste (e que desde já agradeço)

No entanto da-me um erro Name 'linha'is not declared.

Já tentei declarar a linha como Integer e não aceita

já tentei como "linha As DataGridViewRow In PrincipalDataGridView.Rows" como está na rotina que tenho, mas tambem não dá.

Verifico que mudaste o ciclo For Each por For I

como informação tenho a variavel UltimaBusca assim "Private UltimaBusca As Integer = 0"

Será que está comforme?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse erro foi lapso meu, aqui fica a correcção (ainda não testada):

Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click

        Dim texto As String = Nothing


        If ToolStripTextBox1.Text <> String.Empty Then
            'percorre cada linha do DataGridView
            For i As Integer = UltimaBusca To PrincipalDataGridView.Rows.Count
                'percorre cada célula da linha
                For Each celula As DataGridViewCell In PrincipalDataGridView.Rows(i).Cells
                    'se a coluna for a coluna 2 (Designação) então verifica o criterio
                    If celula.ColumnIndex = 2 Then
                        texto = celula.Value.ToString.ToLower
                        'se o texto informado estiver contido na célula então seleciona toda linha


                        If texto.Contains(ToolStripTextBox1.Text.ToLower) And UltimaBusca <> i Then

                            UltimaBusca = i

                            'seleciona a linha
                            Me.PrincipalDataGridView.Rows(celula.RowIndex).Selected = True

                            'faz da seleção a linha currente
                            Me.PrincipalDataGridView.CurrentCell = celula

                            Exit Sub



                        End If
                    End If
                Next
            Next
        End If

    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi amigo Weasel

A correção surtiu efeito, de facto a rotina funciona, no entanto quando chega ao ultimo registo selecccionado da-me o erro "Object reference not set to an instance of an object" na linha

texto = celula.Value.ToString.ToLower.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi amigo Weasel

A correção surtiu efeito, de facto a rotina funciona, no entanto quando chega ao ultimo registo selecccionado da-me o erro "Object reference not set to an instance of an object" na linha

texto = celula.Value.ToString.ToLower.

Tenta nesta linha

For i As Integer = UltimaBusca To PrincipalDataGridView.Rows.Count

Acrescentar -1 no final ficando assim:

For i As Integer = UltimaBusca To PrincipalDataGridView.Rows.Count - 1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi amigo Weasel

A dica funcionou no entanto tive que utilizar o try pois dava erro de excepção tendo ficado assim

 Dim texto As String = Nothing

        Try
            If ToolStripTextBox1.Text <> String.Empty Then
                'percorre cada linha do DataGridView
                For i As Integer = UltimaBusca To PrincipalDataGridView.Rows.Count - 1
                    'percorre cada célula da linha
                    For Each celula As DataGridViewCell In PrincipalDataGridView.Rows(i).Cells
                        'se a coluna for a coluna 2 (Designação) então verifica o criterio
                        If celula.ColumnIndex = 2 Then
                            texto = celula.Value.ToString.ToLower
                            'se o texto informado estiver contido na célula então seleciona toda linha

                            If texto.Contains(ToolStripTextBox1.Text.ToLower) And UltimaBusca <> i Then

                                UltimaBusca = i

                                'seleciona a linha
                                Me.PrincipalDataGridView.Rows(celula.RowIndex).Selected = True

                                'faz da seleção a linha currente
                                Me.PrincipalDataGridView.CurrentCell = celula

                                Exit Sub

                            End If

                        End If

                    Next
                Next
            End If

        Catch ex As Exception
            'MsgBox("Não existem mais Itens com o Valor Pretendido" & vbCrLf & ex.Message)

            UltimaBusca = 0
            MsgBox("Não existem mais Itens com o Valor Pretendido")
        End Try

Obrigado pela atenção

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

[c o d e = v b n e t ]

;)

Só o meti assim para o parser do forum não o apanhar.

É tudo pegado.

Quando usas o botão code, acrescentas =vbnet no

[code]

para ficar assim:
[code=vbnet]

0

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