Jump to content

Juntar informação de DataGridView


SLIFE
 Share

Recommended Posts

Boas a todos

Estou a precisar de ajuda.

É o seguinte eu tenho uma aplicação que esta a importar para dentro de um DataGridView os dados de uma folha de excel.

A segunda DataGridView importa novamente outra folha de Excel.

Eu precisava que ao clicar num botao ele fosse ver na primeira linha da data gried qual era o numerõ que lá estava, e se esse numero existisse, na segunda DataGridView, entao copiava o texto que estava na primeira DataGrid para uma terceira.

Parece confuso.

Tentar Explicar

Na primeira DataGridView, iram aparecer por exemplo 2 colunas sendo elas:

Ref |  NumIng

Na segunda DataGridView, ira surgir apenas duas colunas:

NumIng | DescricaoIngr

E que precisava que ao clicar num botao aparecesse na terceira DataGridView 2 colunas sendo elas:

ref | DescricaoIngr

Assim ficava com a referencia, e a descrição dos ingredientes numa so DataGridView.

Como poderei fazer essa junção??

Se alguem me poder ajudar agradecia..

Cpts

SJC

Sandro Coelho

Link to comment
Share on other sites

Pessoal ninguem tem uma ideia de como poderei resolver este problema???

Estou farto de dar voltas e ja nem sei o que fazer.

Ja ponderei ate cruzar os dados atraves de 2 ficheiros texto.

Será que seria mais facil....

Estou perdido..... Help....

Cpts

SJC

Sandro Coelho

Link to comment
Share on other sites

    Boa tarde,

    Partindo do principio que estas a preencher as datagrids a partir de tabelas, já pensas-te em fazer isso por instrução SQL, tipo select?

    Se colocares os dados que vão para a grid 1 e grid 2 em tabelas temporárias, podes fazer uma query para obteres os dados e alimentar a terceira grid com os resultados da query.

Cordiais cumprimentos,

Apocsantos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

    Boa tarde,

    Partindo do principio que estas a preencher as datagrids a partir de tabelas, já pensas-te em fazer isso por instrução SQL, tipo select?

    Se colocares os dados que vão para a grid 1 e grid 2 em tabelas temporárias, podes fazer uma query para obteres os dados e alimentar a terceira grid com os resultados da query.

Cordiais cumprimentos,

Apocsantos

Desde já obrigado pela ajuda.

O problema é que estou a carregar os dados para a datagried atraves de ficheiros de excel.

Eu fico com a primeira DataGridView preenchida, conforme no exemplo que dei em cima:

Referencia  |  NumIng

A segunda DataGridView fica com:

NumIng  |  DescricaoIng

E eu precisava que o programa verificasse linha a linha, tipo na primeira DataGridView, se a primeira linha tivesse por exemplo o numero 5, ele ia á segunda DataGridView e copiava a DescricaoIng para todas as linhas que tivessem esse numero 5, copiava para a  DataGridView de baixo.

Eu actualmente tenho que fazer assim, abro no excel as duas folhas, e depois abro uma em branco e tenho que copiar á mão, linha a linha.

O problema é que chego a ter mais de 2000 linhas.

Cumprimentos

SJC

Sandro Coelho

Link to comment
Share on other sites

Boas

Sergio Ribeiro ou jpaulino onde andam voces???

Não me conseguem dar uma dica sobre como resolver esta situação??

Estou mesmo atrapalhado, e nem sei como continuar.

Por favor se conseguirem, ou souberem como poderei resolver isto agradecia..

Cpts

SJC

Sandro Coelho

Link to comment
Share on other sites

    Bom dia,

    Já experimentas-te utilizar tabelas criadas dinamicamente, e usar LINQ para fazer isso? Existem muitos exemplos na net de como fazer o que pertendes.

    Uma outra solução seria utilizares um ciclo de forma a que ele te percorresse as tabelas linha a linha compara-se os valores e envia-se os valores para a 3ª grid.

   

Cordiais cumprimentos,

Apocsantos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

    Bom dia,

    Já experimentas-te utilizar tabelas criadas dinamicamente, e usar LINQ para fazer isso? Existem muitos exemplos na net de como fazer o que pertendes.

    Uma outra solução seria utilizares um ciclo de forma a que ele te percorresse as tabelas linha a linha compara-se os valores e envia-se os valores para a 3ª grid.

   

Cordiais cumprimentos,

Apocsantos

Boas

Por acaso não tem ou não sabe onde posso tentar arranjar um exemplo desses??

Estou a ficar com os miolos fritos....

Cpts

SJC

Sandro Coelho

Link to comment
Share on other sites

    Bom dia,

    Penso que este link possa ajudar: http://dotnetarchitect.wordpress.com/2009/03/18/using-linq-to-manipulate-data-in-datasetdatatable/.

    Uma opinião de alguém com alguns anos destas "maquinetas": Quando se foca demasiado num problema perde-se a capacidade de o ver de "fora", e observar outras opções que estão mesmo debaixo do nariz. O melhor a fazer quando um problema começa a chatear muito, é "ir fazer qualquer outra coisa" antes de olhar para o problema de novo.

Cordiais cumprimentos,

Apocsantos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

Uma outra solução seria utilizares um ciclo de forma a que ele te percorresse as tabelas linha a linha compara-se os valores e envia-se os valores para a 3ª grid.

Esta seria a minha sugestão, para não entrares em situações que só te iam baralhar mais.

Entendes o que o apocsantos quis dizer com isto, ou precisas de um exemplo?

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Esta seria a minha sugestão, para não entrares em situações que só te iam baralhar mais.

Entendes o que o apocsantos quis dizer com isto, ou precisas de um exemplo?

Se podesses me dar um exemplo, ou um local onde podesse ver como fazer agradecia.

Estive a ver o exemplo que o opcsantos deixou (link), mas nao consegui entender muito bem o que fazer.

Embora tenha de agradecer ao opcsantos  pela tentativa de ajuda.

Sandro Coelho

Link to comment
Share on other sites

Arranjei 5 minutos 🙂

SLIFE, eis então um exemplo entre duas datatables, criando uma terceira.

Adaptas facilmente ao que pretendes:

        Dim DT As New DataTable
        Dim DT2 As New DataTable
        Dim DT3 As New DataTable

        DT.Columns.Add("UID")
        DT.Columns.Add("Nome")
        DT.Columns.Add("Viatura")
        DT.Rows.Add(1, "Zeca", 1)
        DT.Rows.Add(2, "Malaquias", 3)
        DT.Rows.Add(3, "Maria", 2)
        DT.Rows.Add(4, "Josefina", 1)

        DT2.Columns.Add("VID")
        DT2.Columns.Add("Marca")
        DT2.Columns.Add("Modelo")
        DT2.Rows.Add(1, "Ford", "Ka")
        DT2.Rows.Add(2, "Tesla", "Roadster")
        DT2.Rows.Add(3, "Saleen", "S7")

        DT3.Columns.Add("Nome")
        DT3.Columns.Add("MarcaModelo")

        For Each DR As DataRow In DT.Rows
            For Each DR2 As DataRow In DT2.Rows
                If Integer.Parse(DR("Viatura")) = Integer.Parse(DR2("VID")) Then
                    DT3.Rows.Add(DR("Nome").ToString, DR2("Marca").ToString & " " & DR2("Modelo").ToString)
                    Exit For
                End If
            Next
        Next

        DataGridView1.DataSource = DT3

Que resulta em:

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Consegues mostrar um printscreen do que queres? Não estou a entender muito bem :/

O exemplo da aplicação é a seguinte:

Ve esta imagem: http://www.box.net/shared/fuc8e1fni5

Como podes ver, na primeira DataGridView aparece diversos campos, entre os quais NumIngredientes

Na segunda DataGridView, aparece o NumIngredientes e a descrição dos mesmos.

Eu precisava era de fazer algo que verificasse na primeira DataGridView o valor existente na coluna NumIngredientes

e fosse a segunda DataGridView e copiasse a descrição dos ingredientes.

Tipo, precisava que a terceira DataGridView ficasse assim (Exemplo como faço manualmente no Excel)

Imagem: http://www.box.net/shared/71ptgq43af

Existem na primeira DataGridView diversos NumIngred repetidos.

Na segunda DataGridView já não aparece repetido, é tipo a lista de todos os que existem.

Sei que e de dificil compreensão, mas penso que atraves das imagens consegues perceber o que estou a tentar (Sem sucesso) fazer.

Cpts

SJC

Sandro Coelho

Link to comment
Share on other sites

    Boa tarde,

    Estás a usar datatables para "alimentar" as datagridviews, certo? Se for assim, a resposta está basicamente no exemplo de código que o ribeiro55 te deixou. tens duas datatables, crias uma datatable chamda por exemplo "tabela_final", e utilizas o ciclo para fazer a comparação e preencher os dados na "tabela_final".

Seria alguma coisa parecida com isto: (Simplesmente peguei nos teus printscreens e no código do ribeiro55)

  Dim DT As New DataTable
  Dim DT2 As New DataTable
  Dim tabela_final As New DataTable

For Each DR As DataRow In DT.Rows
            For Each DR2 As DataRow In DT2.Rows
                If Integer.Parse(DR("NumIng")) = Integer.Parse(DR2("NumIng")) Then
                    tabela_final.Rows.Add(DR("Ref").ToString, DR2("DescricaoIngr").ToString )
                    Exit For
                End If
            Next
        Next

        DataGridView3.DataSource = tabela_final

    Se o que pretendes é que por cada vez que ele encontra o a referência do "composto" na tabela de intredientes, ele acrescente o nome do ingrediente na linha onde está o "composto", isso é outra coisa.

Cordiais cumprimentos,

Apocsantos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

Arranjei 5 minutos 🙂

SLIFE, eis então um exemplo entre duas datatables, criando uma terceira.

Adaptas facilmente ao que pretendes:

        Dim DT As New DataTable
        Dim DT2 As New DataTable
        Dim DT3 As New DataTable

        DT.Columns.Add("UID")
        DT.Columns.Add("Nome")
        DT.Columns.Add("Viatura")
        DT.Rows.Add(1, "Zeca", 1)
        DT.Rows.Add(2, "Malaquias", 3)
        DT.Rows.Add(3, "Maria", 2)
        DT.Rows.Add(4, "Josefina", 1)

        DT2.Columns.Add("VID")
        DT2.Columns.Add("Marca")
        DT2.Columns.Add("Modelo")
        DT2.Rows.Add(1, "Ford", "Ka")
        DT2.Rows.Add(2, "Tesla", "Roadster")
        DT2.Rows.Add(3, "Saleen", "S7")

        DT3.Columns.Add("Nome")
        DT3.Columns.Add("MarcaModelo")

        For Each DR As DataRow In DT.Rows
            For Each DR2 As DataRow In DT2.Rows
                If Integer.Parse(DR("Viatura")) = Integer.Parse(DR2("VID")) Then
                    DT3.Rows.Add(DR("Nome").ToString, DR2("Marca").ToString & " " & DR2("Modelo").ToString)
                    Exit For
                End If
            Next
        Next

        DataGridView1.DataSource = DT3

Que resulta em:

Boas Ribeiro

O teu exemplo faz exactamente o que preciso.

Mas agora surgiu-me um problema.

Tu no teu exemplo estas a adicionar os dados a uma datatable certo?

Eu no meu caso estou a adicionar os dados, importando directamente a uma datagrid.

Depois se coloco o teu codigo, ele acaba por nao me preencher nada na datagried3.

Coloquei assim:

  Dim DT As New DataGridView
        Dim DT2 As New DataTable
        Dim DT3 As New DataTable

       
        DT3.Columns.Add("EAN")
        DT3.Columns.Add("DESCRICAOING")

        For Each DR As DataRow In DT.Rows
            For Each DR2 As DataRow In DT2.Rows
                If Integer.Parse(DR("TABING")) = Integer.Parse(DR2("NumeroIngredientes")) Then
                    DT3.Rows.Add(DR("EAN").ToString, DR2("DESCRICAOING").ToString)
                                     Exit For
                End If
            Next
        Next

      
        DataGridView3.DataSource = DT3

Mas como nao existe nada na datatable ele passa pelo codigo e vai directo ao fim.

Sandro Coelho

Link to comment
Share on other sites

Eu estou a alimentar as tabelas desta maneira:

(Agora carrego um ficheiro CVS, mas e para colocar a importar do excel)

'define um DataTable e um DataRow
        Dim dt As New DataTable
        Dim row As DataRow

        'define as variáveis usadas no projeto
        Dim linhaTexto As String = ""
        Dim arrrayDeLinhas() As String
        Dim nomeArquivo As String = ""



        'atribui o nome e caminho do arquivo a caixa de texto
        nomeArquivo = TxtCaminhoficheiroIngredientes.Text




        DataGridView1.ColumnHeadersVisible = True

        'define a estrutura da DataTable que vai receber os dados
        dt.Columns.Add("NumeroIngredientes", Type.GetType("System.String"))
        dt.Columns.Add("DescIngredientes", Type.GetType("System.String"))
        dt.Columns.Add("1", Type.GetType("System.String"))
        dt.Columns.Add("2", Type.GetType("System.String"))
        'dt.Columns.Add("teste2", Type.GetType("System.String"))
      

        'verifica se o arquivo existe
        If File.Exists(nomeArquivo) = True Then
            'cria um novo objeto StreamReader
            Dim objReader As New StreamReader(nomeArquivo, System.Text.Encoding.Default)
            'percorre o arquivo
            Do While objReader.Peek() <> -1
                linhaTexto = objReader.ReadLine()
                arrrayDeLinhas = Split(linhaTexto, ";")
                row = dt.NewRow
                row.ItemArray = arrrayDeLinhas
                dt.Rows.Add(row)
            Loop
            'atribui ao datagridview o objeto datatable criado
            DataGridView2.DataSource = dt
            objReader.Close()



        Else
            MsgBox("O arquivo não foi encontrado...")
        End If

Sandro Coelho

Link to comment
Share on other sites

    Boa noite,

    No exemplo de codigo ultimo, apenas carregas um datatable (dt) com que preenches o datagridview2

DataGridView2.DataSource = dt

    Se bem percebi a ideia, tens duas tabelas, queres que ele simplesmente leia as tabelas e faça a 3ª tabela com dados provenientes das outras duas tabelas, certo?  Se for esse o caso carregas as tabelas para datatables, usas os dadatables correspondentes a cada tabela para "preencher" a respectiva datagridview. Utilizas um ciclo, e crias dinamicamente um terceiro datatable com os dados que pretendes, provenientes das duas tabelas e apresentas os dados no datagridview.

 
        DT3.Columns.Add("EAN") 'Adiciona uma coluna "EAN" ao datatable DT3
        DT3.Columns.Add("DESCRICAOING") 'Adiciona uma coluna "DESCRICAOING" ao datatable DT3

        For Each DR As DataRow In DT.Rows  'para cada linha no datatable1 (começa a percorrer o datatable1)
            For Each DR2 As DataRow In DT2.Rows 'para cada linha no datatable2 (começa a percorrer o datatable2)
                If Integer.Parse(DR("TABING")) = Integer.Parse(DR2("NumeroIngredientes")) Then 'compara o campo "TABING" do datatable1 com o o campo "NumeroIngredientes" do datatable2
                    DT3.Rows.Add(DR("EAN").ToString, DR2("DESCRICAOING").ToString) 'caso sejam iguais acrescenta as as linhas com os correspondentes com os valores "EAN" e "DESCRICAOING" ao datatable3
                                     Exit For
                End If
            Next
        Next

      
        DataGridView3.DataSource = DT3

    Desde que utilizes datatables para armazenar os dados temporariamente, podes utilizar o ciclo que tu proprio escreves-te para gerar o 3º datatable que irá "alimentar" o 3º datagrid com os dados resultantes.

    Aqui perdi-me sobre qual a duvida em concreto.

Cordiais cumprimentos,

Apocsantos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

    Boa noite,

    No exemplo de codigo ultimo, apenas carregas um datatable (dt) com que preenches o datagridview2

DataGridView2.DataSource = dt

    Se bem percebi a ideia, tens duas tabelas, queres que ele simplesmente leia as tabelas e faça a 3ª tabela com dados provenientes das outras duas tabelas, certo?  Se for esse o caso carregas as tabelas para datatables, usas os dadatables correspondentes a cada tabela para "preencher" a respectiva datagridview. Utilizas um ciclo, e crias dinamicamente um terceiro datatable com os dados que pretendes, provenientes das duas tabelas e apresentas os dados no datagridview.

    Desde que utilizes datatables para armazenar os dados temporariamente, podes utilizar o ciclo que tu proprio escreves-te para gerar o 3º datatable que irá "alimentar" o 3º datagrid com os dados resultantes.

    Aqui perdi-me sobre qual a duvida em concreto.

Cordiais cumprimentos,

Apocsantos

Boa noite

Após varias tentativas, e varias visualizações do codigo descubri o problema de nao estar a alimentar a 3 datagried como pretendia, era falha no codigo que ja tinha anteriormente criado. (Antes de voce e o ribeiro55 me darem o exemplo)

Agora experimentei com calma, e com alguma pequenas alterações e parece que ja esta mais ou menos bem incaminhado.

Amanha vou voltar a ver com mais calma, e se funcionar digo.

Desde já muito obrigado pela ajuda até aqui prestada.

Cpts

SJC

Sandro Coelho

Link to comment
Share on other sites

Boas Pessoal

Tive de voltar a este topico, pois tive um problema com a pen que tinha o codigo a trabalhar e la se foi o trabalho todo.

E seguranças nem ve-las.

Agora tive de voltar a refazer o que ja tinha feito e que funcionava.

Pois agora nao funciona.

Tenho o codigo como está em cima, e ele começa a passar pelos Rows e vai fazendo a comparação.

O problema surge penso eu, quando ele chega fim, ou entao quando acaba uma das datagrids.

Pois ele dá erro nesta linha:

If Integer.Parse(DR("TABING")) = Integer.Parse(DR2("NUMING")) Then

o erro é:

A conversão do tipo 'DBNull' para o tipo 'String' não é válida.

Estive a ver e o DR2 esta a Null, o que deverá querer dizer que percorreu toda a datagrid e chegou ao fim.

Mas a outra datagrid ainda tem valores, será isso????

Tambem nao consigo retirar a ultima linha que aparece em branco no datagrid.

Já experimentei colocar o allowuseraddnew para false, mas mesmo assim ela aparece.

Alguem sabe o porque??

Cpts

SJC

Sandro Coelho

Link to comment
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
 Share

×
×
  • Create New...

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.