Ir para conteúdo
Fórum Script Brasil
  • 0

Find em DataGridView


elwissan

Pergunta

13 respostass a esta questão

Posts Recomendados

  • 0

Percorra a coleção Rows da DataGridView

'você quer dizer isso?

Dir_DBGrid = Tabela 1

GridPesq = Tabela 2

Dim i As Integer
        For i = 0 To Dir_DBGrid.Rows.Count - 1
            If Dir_DBGrid.Rows(i).Cells(0).Value = GridPesq.CurrentRow.Cells(5).Value Then
                'Caso for igual
                ''Dir_DBGrid.Rows(i).Cells(0).Value = "c:\Iamgens\EmpresaX" (Diretório)
                ''GridPesq.CurrentRow.Cells(1).Value = "Imagem01.jpg"
                PictureBox1.Load(Dir_DBGrid.Rows(i).Cells(0).Value & "\" & GridPesq.CurrentRow.Cells(1).Value)
                ''É exibido a imagem.
                Exit For
            End If
        Next i

' Até aqui tudo bem mas se eu tiver uns cinco mil itens? Toda vez em que navegar ele vai fazer isso e vai demorar muito para achar o item, então tem de ser de outra maneira.

- x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x

Visão geral e explicação:

Por enquanto, eu criei dois arquivos .txt somente para serem carregados nos DataGrid para poder desenvolver sem ter de criar logo de “cara” o banco de dados. Tenho a intenção de criá-lo por último ou tentar evitar até não dar mais.

Estou trabalhando com um banco de dados e duas tabelas.

São dois DataGrid que estou usando:

O primeiro Grid tem duas colunas comuns que são: Nome da empresa e Diretório (que é o caminho da imagem para ser exibido na PictureBox ).

O Segundo Grid, terá umas cinco colunas e entre elas uma coluna no formato ComboBox com o nome de Nome da Empresa.

Detalhe: Este comboBox terá em sua lista todos os itens do campo Nome da empresa do primeiro Grid.

Tenho que associar os dois campos Nome da Empresa de cada tabela para que cada vez em que eu navegar pelo segundo Grid, possa encontrar o caminho no primeiro Grid e carregar a imagem na PictureBox (um visualizador).

Como o banco de dados ainda não foi criado, estou tentando usar o máximo dos códigos sem ter que usar os recursos dos bandos de dados. Claro tem hora que não dá mais e é bem melhor usar os recursos que eles oferecem.

Não é necessário as tabelas estarem vinculadas, basta eu associar de alguma forma, ou seja, localizando através do nome da empresa ou pelo index do item (associo através do index e depois crio a linha de comando).

O que vocês sugerem? Ou é melhor usar os recursos do banco de dados?

Obrigado até mais. :)

Acho melhor ler tudo para entender a primaira parte do que eu escrevi.

Desculpe.

Link para o comentário
Compartilhar em outros sites

  • 0
Até aqui tudo bem mas se eu tiver uns cinco mil itens? Toda vez em que navegar ele vai fazer isso e vai demorar muito para achar o item, então tem de ser de outra maneira.

A menos que isso vá ser executado em um computador bem velhinho, percorrer 5000 mil linhas, dependendo da condição a ser executada, é tranquilo. Em todo caso, também pode-se usar uma busca binária, caso os dados estejam em ordem.

Todavia, acho que um banco de dados (mesmo que seja o Access) é sempre bem-vindo. :)

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

amigos, tentei usar este exemplo mas não deu ce

rto, então tentei fazer assim:

Public Sub pesquisaCliente()
        Dim texto As String = Nothing

        If frmClientes.txtNomePesq.Text <> String.Empty Then


            'percorre cada linha do DataGridView
            For Each linha As DataGridViewRow In frmClientes.DataGridView1.Rows

                'percorre cada célula da linha
                For Each celula As DataGridViewCell In frmClientes.DataGridView1.Rows(linha.Index).Cells

                    'se a coluna for a coluna 1 (Nome) então verifica o criterio
                    If celula.ColumnIndex = 1 Then
                        texto = celula.Value.ToString
                        'se o texto informado estiver contido na célula então seleciona toda linha
                        If texto.Contains(frmClientes.txtNomePesq.Text) Then
                            'seleciona a linha
                            frmClientes.DataGridView1.CurrentCell = celula
                            Exit Sub
                        End If

                    End If

                Next

            Next

        End If

    End Sub
funciona, mas se eu digito uma sequencia de dados tipo "aa" ele retorna o erro:
System.NullReferenceException was unhandled
  Message="Object reference not set to an instance of an object."

isso é porque não encontro nada... como faço pra ignorar isso ? valeu

detalhe, estouchamando essa função no changed de um textbox no mesmo form

Link para o comentário
Compartilhar em outros sites

  • 0

Eu costumo colocar objetos na DataGridView, então para buscar bastaria percorrer as linhas verificando a propriedade Nome de cada objeto. Mas, no seu caso você está olhando o texto das células, então ficaria algo como:

Dim texto As String = Nothing

If frmClientes.txtNomePesq.Text <> String.Empty Then
    'percorre cada linha do DataGridView
    For Each linha As DataGridViewRow In frmClientes.DataGridView1.Rows
        celula = linha(1) 'Índice 1 = coluna nome

        texto = celula.Value.ToString().ToLower()

        'se o texto informado estiver contido na célula então seleciona toda linha
        If texto.Contains(frmClientes.txtNomePesq.Text) Then
            'seleciona a linha
            frmClientes.DataGridView1.CurrentCell = celula
            Exit Sub
        End If
    Next
End If
Quanto ao erro, talvez alguma célula sua esteja com um valor nulo, então seria bom fazer uma verificação do tipo:
if celula.value isnot nothing then
    texto = celula.value.tostring().tolower()
else
    texto = ""
endif

Certo? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
ok, mas a variável célula estava declarada já no for each... agora ela não existe mais...

e agora ? :huh:

É só declará-la lá no início: :rolleyes:

Dim celula As DataGridViewCell

percebi também que o erro dá quando tem nome e sobrenome e pesquiso só pelo nome...

Qual o erro que dá e em qual linha?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

olha só...

[quote]Public Sub pesquisaCliente()
        Dim texto As String = Nothing
        Dim celula As DataGridViewCell

         'percorre cada linha do DataGridView
        For Each linha As DataGridViewRow In frmClientes.DataGridView1.Rows
            celula = linha.Cells(1) 'Índice 1 = coluna nome
           
            texto = celula.Value.ToString().ToLower()
            If texto = Nothing Then
                Exit Sub
            End If
            'se o texto informado estiver contido na célula então seleciona toda linha
            If texto.Contains(frmClientes.txtNomePesq.Text) Then
                'seleciona a linha
                frmClientes.DataGridView1.CurrentCell = celula
                Exit Sub
            End If
        Next
        
    End Sub
[/quote]

funciona, percorre cada linha do datagridview, somente na coluna nome, isso tá ok...

mas quando chega na última linha, que é null ele dá o erro citado acima (NullreferenceException Unhandled)... tem como colocar uma condição pra quando chegar ao fim das linhas ele parar ?

Link para o comentário
Compartilhar em outros sites

  • 0

Consegui resolver... achei que ficou P.O.G(para quem não sabe o que é POG, clique aqui) .... :D mas funciona!!! olha o que eu fiz:

Coloquei um contador, uma variavel que ao se igualar ao numero de registros, sai da sub... porque o erro dava quando ele tentava vrificar o registro depois do último e era null, então deixei a função assim... quem quiser usar, funciona! Ao digitar um nome numa caixa de texto... ele seleciona a linha correspondente no datagridview...

Dim texto As String = Nothing
        Dim celula As DataGridViewCell
        Dim contagem As Integer

        'percorre cada linha do DataGridView
        For Each linha As DataGridViewRow In frmClientes.DataGridView1.Rows
            celula = linha.Cells(1) 'Índice 1 = coluna nome
            
            texto = celula.Value.ToString().ToLower()

            'se o texto informado estiver contido na célula então seleciona toda linha
            If texto.Contains(frmClientes.txtNomePesq.Text) Then
                'seleciona a linha
                frmClientes.DataGridView1.CurrentCell = celula
                Exit Sub
            End If
            contagem = contagem + 1
            If contagem = frmClientes.DataGridView1.RowCount - 1 Then
                Exit Sub
            End If
        Next

Agora to com outra dúvida, após cadastrar um registro, coloquei uma decisão... se o usuario deseja cadastrar outro cliente, se sim, limpa os campos do form e inicia um novo cadastro, se não mostra o datagridview, o problema é que quando mostra o datagridview ele não se atualiza automaticamente com o último registro cadastrado... tentei datagridview.refresh, mas não deu... alguma ajudinha ?

valeu!!! :)

Link para o comentário
Compartilhar em outros sites

  • 0

Acho que para evitar a POG você poderia testar se o "celula" é nulo (Nothing, através do operador IsNot), antes de efetivamente usá-la.

Quanto a sua nova dúvida, acho que você tem que associar novamente os dados à DataGridView.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...