none
Como passar dados (uma linha) de um DataGridView para outro DataGridView? RRS feed

  • Pergunta

  • Pessoal,

    Preciso de mais uma outra ajuda de vocês.

    Tenho um Form que tem um DataGridView alimentado com um DataSet proveninente de um Select de uma tabela Produtos. Então, gostaria de ao dar um duplo clique na linha do primeiro DataGridView, esses dados da linha selecionada fossem para o outro DataGridView.

    Eu já sei mais ou menos uma maneira de fazer, mas que é simplesmente pegando a linha selecionada e jogando para o outro DataGridView.

    Então, não sei se essa é uma maneira correta para fazer esse procedimento, já que o que eu quero fazer é pegar os dados desse outro DataGridView e inseri-los em uma outra tabela Itens no banco de dados. Pois se trata de um Form de vendas, no qual irei inserir todos os itens na tabela Itens e inserirei a venda correspondente a esses itens na tabela Venda.

    Sendo assim, qual o melhor modo, ou a melhor prática para passar de as linhas que eu quero de um DataGridView para um outro DataGridView. É simplesmente passando as linhas para ele? Ou jogando um em um array List<> do construtor de uma classe Itens, passando os valores para o List<> de cada linha? Ou ate outra forma.

    E para depois inserir no banco de dados esses itens (na tabela Itens), como poderia fazer? Percorrer o DataGridView de itens e ir inserindo um a um no banco de dados? Ou há também uma forma melhor?

    Me desculpem mais uma vez, pela quantidade grande de perguntas. :)
    E espero que tenha explicado direito. :)

    Obrigado desde já a todos.

    Rodrigo Francisquini
    domingo, 1 de fevereiro de 2009 04:22

Respostas

  • Boa tarde,

    voce pode montar seu datasource da maneira mostrada pelo Angus MacGyver logo acima, setando no formLoad o DataSource dos dois GridViews para a mesma fonte por exemplo.

    // Vinculamos os DataGridViews aos seus respectivos DataTables.     
    dataGridView1.DataSource = ds.Tables["Customers"];  
    dataGridView2.DataSource = ds.Tables["Customers"]; 

    feito isso desvinculamos o Grid de BackUp do DataSorce setando como null, assim;

    dataGridView2.DataSource = Null

    Assim quando voce manipular os dados do grid principal o secundário não será alterado, uma vez que ele não tem nenhum DataSource vinculado.



    “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Marcar como Resposta” para beneficiar outros membros da comunidade que estejam lendo este thread”.
    Atenciosamente,
    Harley Araujo
    • Sugerido como Resposta interger terça-feira, 14 de julho de 2009 21:48
    • Marcado como Resposta Harley AraujoModerator quarta-feira, 15 de julho de 2009 12:48
    terça-feira, 14 de julho de 2009 20:39
    Moderador

Todas as Respostas

  • Há varias coisas que podem ser feitas, mas já que está trabalhando com DataTable e os dados do outro DataGridView também devem ser gravados na tabela Itens, você poderia vincular o segundo DataGridView a um DataTable preenchido com o esquema da tabela Itens do seu banco e incluir as colunas relevantes do DataTable que contém os dados da tabela  Produtos no DataTable que contém/conterá os dados da tabela Itens.

    O exemplo abaixo produz um clone do DataTable vinculado a um DataTaGridView de nome dataGridView1 de forma a que os dados da linha clicada em dataGridView1 apareçam num segundo DataGridView chamado dataGridView2. Adapte o exemplo para funcionar do modo descrito no primeiro parágrafo.

    O exemplo usa o banco de exemplo Northwind. Para testá-lo inclua dois DataGridViews num Form, deixe-os com os nomes padrão e siga os passos descritos abaixo.

    No escopo da classe, declare uma variável para referenciar um objeto DataSet:

    private DataSet ds = null


    Crie os objetos, faça a consulta e preencha os dados com um código como este:


    // String de conexão.  
    SqlConnection cnn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=SSPI;");  
    // Selecionamos todos os dados da tabela Customers.  
    SqlDataAdapter daCustomers = new SqlDataAdapter("SELECT * FROM Customers", cnn);  
     
    ds = new DataSet();  
     
    // Preenchemos o DataTable "Customers".  
    daCustomers.Fill(ds, "Customers");  
     
    // Criamos um novo DataTable para ser o clone do DataTable "Customers"  
    DataTable dt = new DataTable();  
    // Clonamos o DataTable "Customers"  
    dt = ds.Tables["Customers"].Clone();  
    // Alteramos o nome do DataTable clone para que ele possa ser   
    // incluído no mesmo DataSet do DataTable original.  
    dt.TableName = "CustomersClone";  
    // Adicionamos o clone ao DataSet.  
    ds.Tables.Add(dt);  
     
    // Vinculamos os DataGridViews aos seus respectivos DataTables.  
    dataGridView1.DataSource = ds.Tables["Customers"];  
    dataGridView2.DataSource = ds.Tables["CustomersClone"]; 


    Finalmente no método do evento CellMouseDoubleClick do DGV dataGridView1 inclua o código necessário para copiar os dados relevantes de um DataTable para o outro. Para os propósitos deste exemplo poderia ser algo assim:

    private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)  
    {  
        // Verificamos se o número de linhas do DataGridView está dentro da posição selecionada,  
        // se não estiver não fazemos nada.  
        if (this.BindingContext[ds.Tables["Customers"]].Position > ds.Tables["Customers"].Rows.Count - 1)  
        {  
            return;  
        }  
     
        // Obtemos o DataRow da posição clicada.  
        DataRow dr = ds.Tables["Customers"].Rows[this.BindingContext[ds.Tables["Customers"]].Position];  
     
        // Procuramos pelo registro com o ID do item selecionado para a inclusão  
        // no DataTable "CustomersClone".  
        DataRow[] drs = ds.Tables["CustomersClone"].Select("CustomerID = '" + dr["CustomerID"].ToString() + "'");  
        // Verificamos o tamanho do array para sabermos se o item selecionado já existe no  
        // DataTable "CustomersClone".  
        if (drs.Length == 0)  
        {  
            // O item não existe! Incluímos.  
            ds.Tables["CustomersClone"].ImportRow(dr);  
        }  



    "Software Engineers don't have Trophy Wives; they have Presentation Layers."
    domingo, 1 de fevereiro de 2009 15:27
  • Olá Angus,

    Desculpe a demora pelo feedback, mas andei meio ocupado por esses dias.

    Sua solução é meio complexa (pelo para mim que não tenho um nível avançado :)). Não é simplesmente pegar uma linha de um DataGridView e jogar para o outro.

    Fiz a sua solução e funcionou perfeitamente. Só que quando eu aplico o DataSet clonado ao segundo DataGridView nao aparece os dados lá. Só o Headers da tabela. Mas acredito que seja assim mesmo.

    Quando eu dou o duplo clique lá no primeiro DataGridView com o código que eu coloquei no CellMouseDoubleClick vai certinho para o segundo DataGridView.

    Agora minha dúvida é a seguinte. Como eu faco, qual a maneira correta, para incluir esses dados que estão no segundo DataGridView no banco de dados?

    Muito Obrigado.


    Rodrigo Francisquini
    quinta-feira, 5 de fevereiro de 2009 03:17
  • Rodrigo Francisquini disse:

    Sua solução é meio complexa (pelo para mim que não tenho um nível avançado :)). Não é simplesmente pegar uma linha de um DataGridView e jogar para o outro.



    Bom, você pode copiar os dados diretamente no DGV e depois gravá-los no banco com o uso de um laço que faça uma iteração pelos itens DGV, sem o uso do DataTable. Só dei minha opinião de que, já que você está vinculando o primeiro DGV a um DataSet mesmo, seria mais simples (e lógico) fazer o mesmo com o segundo.


    Rodrigo Francisquini disse:

    Fiz a sua solução e funcionou perfeitamente. Só que quando eu aplico o DataSet clonado ao segundo DataGridView nao aparece os dados lá. Só o Headers da tabela. Mas acredito que seja assim mesmo.



    No exemplo eu copiei apenas a estrutura (esquema) do primeiro DataTable para o segundo para que todo o DataRow fosse idêntico e pudesse ser copiado de uma vez com o uso do método ImportRow(). Mas isso foi feito apenas para o propósito de exemplo, não precisa ser assim e você poderia copiar os dados do DataTable também bem como importar manualmente apenas as colunas de um DataRow em que esteja interressado ao invés de todo o DataRow. De fato, imagino que os DataTables deverão ter estruturas diferentes, já que as tabelas no banco deverão ser diferentes também, não?. Se esse for o caso deverá copiar apenas as colunas (campos) do DataRow em que esteja interessado mesmo.

    Por exemplo, para copiar a estrutura E o dados de um DataTable para o outro, simplesmente substitua o método Clone() pelo método Copy() do obheto DataTable. Assim:

    // String de conexão.     
    SqlConnection cnn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=SSPI;");  
    // Selecionamos todos os dados da tabela Customers.     
    SqlDataAdapter daCustomers = new SqlDataAdapter("SELECT * FROM Customers", cnn);  
     
    ds = new DataSet();  
     
    // Preenchemos o DataTable "Customers".     
    daCustomers.Fill(ds, "Customers");  
     
    // Criamos um novo DataTable para ser o clone do DataTable "Customers"     
    DataTable dt = new DataTable();  
    // COPIAMOS A ESTRUTURA E OS DADOS DO DataTable "Customers".  
    dt = ds.Tables["Customers"].Copy();  
    // Alteramos o nome do DataTable clone para que ele possa ser      
    // incluído no mesmo DataSet do DataTable original.     
    dt.TableName = "CustomersClone";  
    // Adicionamos o clone ao DataSet.     
    ds.Tables.Add(dt);  
     
    // Vinculamos os DataGridViews aos seus respectivos DataTables.     
    dataGridView1.DataSource = ds.Tables["Customers"];  
    dataGridView2.DataSource = ds.Tables["CustomersClone"]; 



    Rodrigo Francisquini disse:

    Agora minha dúvida é a seguinte. Como eu faco, qual a maneira correta, para incluir esses dados que estão no segundo DataGridView no banco de dados?



    Você precisará de um DataAdapter e os comandos para inclusão, atualização etc. dos registros. Leia atentamente os tópicos dos links abaixo, na ordem, e entenderá o que precisará fazer:

    http://social.msdn.microsoft.com/forums/pt-BR/vscsharppt/thread/a6ea5243-50f8-41e4-8963-7155bce29aa4/
    http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/b8dfef2d-dc55-4e3f-a06d-eaab422535fd/



    "Software Engineers don't have Trophy Wives; they have Presentation Layers."
    quinta-feira, 5 de fevereiro de 2009 15:51
  • É... Eu li os tópicos, mas não consegui fazer a inclusão, pois eu leio os dados do primeiro DataGridView de um ListBox, ou seja, tenho os tipos dos produtos no ListBox que ao ser clicado carrega o DataGridView com os produtos referidos ao tipo desejado. E após isso eu dou o duplo clique no primeiro DataGridView e incluo os produtos no segundo DataGridView.

    O problema é que quando eu mudo o tipo do produto no ListBox o conteúdo do segundo DataGridView some. Acho eu que pelo modo que eu vínculo os produtos do segundo DataGridView pelo DataSet.

    O outro problema é a inclusão dos dados no Banco de Dados, que eu não entendi como fazer essa inclusão, sendo que eu teria que incluir a venda da tabela de venda, e incluir os produtos na tabela de itens vendidos, que são duas tabelas distintas das que uso nos ListBox e DataGridView.

    Obrigado.

    Rodrigo Francisquini
    sábado, 7 de fevereiro de 2009 23:51
  • Olá,

    Bom minha recomendação é que você faça tudo sem utilizar DataSet, assim fica desvinculado do DataGridView.

    Começe dando uma olhada nestes artigos, com certeza com a leitura deles, você conseguir implementar sua solução:
    - Displaying Data in the Windows Forms DataGridView Control
    - How to: Access Objects Bound to Windows Forms DataGridView Rows
    - How to: Bind Objects to Windows Forms DataGridView Controls

    []'s
    terça-feira, 7 de abril de 2009 18:17
    Moderador
  • gustavo observei seu codigo de copias entre dois grids, quero fazer algo semelhante, quero fazer o seguinte copiar os dados de uma grid para outro estando ambos carregados  com os dados, vou ser mais claro cada entrada de um registro em um grid quero que seja realizada uma copia deste registro em outro grid, sem que esse segundo grid sofra as alterações do primeiro,seria algo como um backup, tem como fazer isto? desde ja agradeço 
    segunda-feira, 13 de julho de 2009 21:33
  • Olá,

    Os DGVs serão carregados no mesmo instante ou condicionalmente ? Se forem carregados no mesmo instante você pode usar o mesmo DataSource para populá-los e em seguida desvincular o "Grid de Backup" do Sorce, setando como NULL, apartir daí voce pode adicionar as linhas alterada programaticamente.

    Espero que tenha ajudado.

    “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Marcar como Resposta” para beneficiar outros membros da comunidade que estejam lendo este thread”.
    Atenciosamente,
    Harley Araujo
    terça-feira, 14 de julho de 2009 13:16
    Moderador
  • Olá,

    Os DGVs serão carregados no mesmo instante ou condicionalmente ? Se forem carregados no mesmo instante você pode usar o mesmo DataSource para populá-los e em seguida desvincular o "Grid de Backup" do Sorce, setando como NULL, apartir daí voce pode adicionar as linhas alterada programaticamente.

    Espero que tenha ajudado.

    “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Marcar como Resposta” para beneficiar outros membros da comunidade que estejam lendo este thread”.
    Atenciosamente,
    Harley Araujo
    sim serão carregados simultaemente, mas não consegui montar o codigo corretamente voce pode me dar uma luz?
    terça-feira, 14 de julho de 2009 18:43
  • deixa eu ver se entendi... vc quer pegar o Produto (do seu estoque) selecionado e incluir o mesmo numa tabela de Produtos da sua venda ?

    Imaginando q vc tenha uma propriedade:

    private List<Produto> vendasItens;

    que vc usar para carregar a sua grid de venda... acho q seria algo assim:


    foreach (DataGridViewRow selectedRow in gridProdutos.SelectedRows) {
       Produto produto = (Produto)selectedRow.DataBoundItem
       vendasItens.Add(produto);
       gridVenda.DataSource = vendaItens;
    }

    e na confirmação da venda... vc pega os itens do list vendaitens e inclui no seu banco de dados
    Se não funciona de um jeito, tente de outro totalmente diferente ^_^
    terça-feira, 14 de julho de 2009 20:34
    Moderador
  • Boa tarde,

    voce pode montar seu datasource da maneira mostrada pelo Angus MacGyver logo acima, setando no formLoad o DataSource dos dois GridViews para a mesma fonte por exemplo.

    // Vinculamos os DataGridViews aos seus respectivos DataTables.     
    dataGridView1.DataSource = ds.Tables["Customers"];  
    dataGridView2.DataSource = ds.Tables["Customers"]; 

    feito isso desvinculamos o Grid de BackUp do DataSorce setando como null, assim;

    dataGridView2.DataSource = Null

    Assim quando voce manipular os dados do grid principal o secundário não será alterado, uma vez que ele não tem nenhum DataSource vinculado.



    “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Marcar como Resposta” para beneficiar outros membros da comunidade que estejam lendo este thread”.
    Atenciosamente,
    Harley Araujo
    • Sugerido como Resposta interger terça-feira, 14 de julho de 2009 21:48
    • Marcado como Resposta Harley AraujoModerator quarta-feira, 15 de julho de 2009 12:48
    terça-feira, 14 de julho de 2009 20:39
    Moderador
  • Origado a dica que voce mandou agora tinha feito, como vc recomendou (dataGridView2.DataSource = Null ;) ,valeu
    terça-feira, 14 de julho de 2009 21:50