none
Clonar dados de um DataGridView em C# RRS feed

  • Pergunta

  • Boa noite,
    Estou aqui novamente pedindo ajuda a quem puder me ajudar.
    Tenho dois Form (FormGrid_1 e FormGrid_2), cada um tem dois datagridview. No FormGrid_1 o primeiro datagridview recebe dados direto do banco de dados, o segundo recebe dados dum TextBox. Ao clicar no botão copia quero clonar esses dois datagridview no FormGrid_2. O primeiro datagridview (que recebe dados do banco) consegui clonar,esta ok. O segundo que recebe os dados do TextBox não consigo clonar.

    Alguém pode me ajudar.

    O código que estou usando é o seguinte:

    //========CLONA PRIMEIRO GRID
                DataTable dtss = new DataTable();
                DataSet dt = new DataSet();

                if (this.grid1.DataSource is DataTable)
                {
                    dtss = (DataTable)this.grid1.DataSource;
                    FormGrid_2 frm2 = new FormGrid_2();
                    frm2.tabela = dtss;
                    frm2.Show();
                }
                else
                {
                    if (this.grid1.DataSource is DataSet)
                    {
                        dt = ((DataView)(this.grid1.DataSource)).Table.DataSet;
                        FormGrid_2 frm2 = new FormGrid_2();
                        frm2.tabela = dt.Tables[0];
                        frm2.Show();
                    }
                }
                //========PARA CLONAR SEGUNDO GRID

                DataGridView dgv_copy = new DataGridView();

                {
                    if (dgv_copy.Columns.Count == 0)
                    {
                        foreach (DataGridViewColumn dgvc in grid_coord.Columns)
                        {
                            grid_copia.Columns.Add(dgvc.Clone() as DataGridViewColumn);
                        }
                    }

                    DataGridViewRow row = new DataGridViewRow();

                    for (int i = 0; i < grid_coord.Rows.Count; i++)
                    {
                        row = (DataGridViewRow)grid_coord.Rows[i].Clone();
                        int intColIndex = 0;
                        foreach (DataGridViewCell cell in grid_coord.Rows[i].Cells)
                        {
                            row.Cells[intColIndex].Value = cell.Value;
                            intColIndex++;
                        }

                        grid_copia.Rows.Add(row);
                    }
                }

    Obs.: Para teste criei um terceiro datagridview no FormGrid_1 (com o nome grid_copia, mesmo nome do segundo datagridview do FormGrid_2), nesse ele clona os dados.

    Acho que dá para entender minha pergunta...

    Agradeço a quem puder me ajudar

                                  
    quinta-feira, 26 de abril de 2012 02:44

Respostas

  • Fiz um projeto igual o seu, portanto esse código está testado. Não esqueça de mudar a propriedade modifiers dos dois DataDrids do Form2 para public.

    private void bt_copiar2_Click(object sender, EventArgs e) { //INSTANCIA O FORM2 FormGrid_2 frm2 = new FormGrid_2(); //CLONA PRIMEIRO DATAGRIDVIEW frm2.grid_Ctipo.DataSource = grid_tipo.DataSource; ; //PARA CLONAR SEGUNDO DATAGRIDVIEW //PARA CLONAR AS COLUNAS for (int i = 0; i < grid_coord.Columns.Count; i++) { var novaColuna = (DataGridViewColumn)grid_coord.Columns[i].Clone(); frm2.grid_Ccoord.Columns.Add(novaColuna); } //PERCORRE CADA LINHA DO GRID ANTIGO, OBTEM SEUS VALORES E ADICIONA NO GRID NOVO for (int indexLinha = 0; indexLinha < grid_coord.RowCount; indexLinha++) { //CLONA A LINHA E CRIA AS CELULAS var novaLinha = new DataGridViewRow(); novaLinha.CreateCells(grid_coord); frm2.grid_Ccoord.Rows.Add(novaLinha); //CLONA OS VALORES DAS CELULAS for (int indexColuna = 0; indexColuna < grid_coord.Columns.Count; indexColuna++) { frm2.grid_Ccoord[indexColuna, indexLinha].Value = grid_coord[indexColuna, indexLinha].Value; } }

    //EXIBE O FORM2 COM OS GRIDS CLONADOS frm2.Show(); }


    Não esqueça de marcar a resposta e as publicações uteis ;)


    terça-feira, 1 de maio de 2012 14:46

Todas as Respostas

  • Boa noite pessoal,

    Po gentiliza alguém pode me ajudar no problema acima.

    Fico muito grato se alguém disponibilizar alguma ajuda ou dica.

    Abraço,

    Gabryel

    sexta-feira, 27 de abril de 2012 00:56
  • Testa esse e ve se funciona...

                 //CLONA AS COLUNAS
                for (int i = 0; i < gridAntigo.Columns.Count; i++)
                {
                    var novaColuna = (DataGridViewColumn)gridAntigo.Columns[i].Clone();
                    gridNovo.Columns.Add(novaColuna);
                }
    
                //PERCORRE CADA LINHA DO GRID ANTIGO, OBTEM SEUS VALORES E ADICIONA NO GRID NOVO
                for (int indexLinha = 0; indexLinha < gridAntigo.RowCount; indexLinha++)
                {
                    //CLONA A LINHA E CRIA AS CELULAS
                    var novaLinha = new DataGridViewRow();
                    novaLinha.CreateCells(gridAntigo);
                    gridNovo.Rows.Add(novaLinha);
    
                    //CLONA OS VALORES DAS CELULAS
                    for (int indexColuna = 0; indexColuna < gridAntigo.Columns.Count; indexColuna++)
                    {
                        gridNovo[indexColuna, indexLinha].Value = gridAntigo[indexColuna, indexLinha].Value;
                    }
                }

    Se ajudou não esqueça de marcar ;)





    sexta-feira, 27 de abril de 2012 18:01
  • Boa noite Renato,

    Fico grato pela atenção, mas a rotina que vc passou é para clonar o datagridview no mesmo form. O que eu estou precisando é clonar este datagridview em outro form. Situação que não estou conseguindo.

    Se puder me ajudar, fico muito agradecido.

    Abraço,

    Gabryel

    sábado, 28 de abril de 2012 00:10
  • Essa rotina funciona para clonar tanto no mesmo Form quanto em outro Form. Primeiro voce entra no seu Form2 e muda a propriedade  modifiers do DataGrid para public. Assim vc consegue acessar o DataGrid de outro form.

    Depois vc faz assim:

     //INSTANCIA O NOVO FORM
                var novoForm = new formGrid_2()
    
                //CLONA AS COLUNAS
                for (int i = 0; i < gridAntigo.Columns.Count; i++)
                {
                    var novaColuna = (DataGridViewColumn)gridAntigo.Columns[i].Clone();
                    novoForm.gridNovo.Columns.Add(novaColuna);
                }
    
                //PERCORRE CADA LINHA DO GRID ANTIGO, OBTEM SEUS VALORES E ADICIONA NO GRID NOVO
                for (int indexLinha = 0; indexLinha < gridAntigo.RowCount; indexLinha++)
                {
                    //CLONA A LINHA E CRIA AS CELULAS
                    var novaLinha = new DataGridViewRow();
                    novaLinha.CreateCells(gridAntigo);
                    novoForm.gridNovo.Rows.Add(novaLinha);
    
                    //CLONA OS VALORES DAS CELULAS
                    for (int indexColuna = 0; indexColuna < gridAntigo.Columns.Count; indexColuna++)
                    {
                        novoForm.gridNovo[indexColuna, indexLinha].Value = gridAntigo[indexColuna, indexLinha].Value;
                    }
    
                    //EXIBE O FORMULARIO COM O GRID CLONADO
                    novoForm.Show();
                }



    sábado, 28 de abril de 2012 05:26
  • Boa noite Renato,

    Fiz exatamente o que vc disse, fui no Form2, na propriedade do datagridview e mudei para public e não estou conseguindo acessar nada no Form1. Inclusive adicionei um button e textbox no Form2 e mudei a propriedade Modifiers para public para testar e também não consigo acessar no Form1.

    Será que tem alguma possiblidade de ser algum problema no meu Visual Studio 2010?

    Agradeço muito se puder continuar me auxiliando...

    Grande abraço,

    Gabryel

    segunda-feira, 30 de abril de 2012 04:01
  • Você está instanciando seu Form2 antes de tentar acessar os botões e DataGrid? Porque olhei seu código lá encima e vi o seguinte: Voce instancia o Form2, popula o primeiro DataGrid dele e já dá um Show, dai você já exibe o form2 antes de popular o segundo DataGrid dele... Me passa o nome do seu primeiro e segundo DataGrid no Form1 e primeiro  segundo DataGrid no form2 que eu faço um código completo pra voce.
    segunda-feira, 30 de abril de 2012 10:59
  • Boa noite,

    Tentei acessar os datagridview antes de instanciar meu Form2 e permaneceu os erros, ou seja, não consegui acessar nada do Form2, no Form1.

    Aqui vai parte do código que estou usando:

    //BOTÃO PARA INSERIR DADOS NO SEGUNDO DATAGRIDVIEW (grid_coord)
            private void bt_inserir_Click(object sender, EventArgs e)
            {
                //inserir dados do textbox no datagridview
                grid_coord.Rows.Insert(0, text_inserir.Text);
                //limpa o textbox
                text_inserir.Clear();
                //permanece o cursor no textbox
                text_inserir.Focus();
            }

            //BOTÃO PARA CLONAR O PRIMEIRO E SEGUNDO DATAGRIDVIEW
            private void bt_copiar2_Click(object sender, EventArgs e)
            {
                //CLONA PRIMEIRO DATAGRIDVIEW
                DataTable dtss = new DataTable();
                DataSet dt = new DataSet();

                if (this.grid_tipo.DataSource is DataTable)
                {
                    dtss = (DataTable)this.grid_tipo.DataSource;
                    FormGrid_2 frm2 = new FormGrid_2();
                    frm2.tabela = dtss;
                    frm2.Show();
                }
                else
                {
                    if (this.grid_tipo.DataSource is DataSet)
                    {
                        dt = ((DataView)(this.grid_tipo.DataSource)).Table.DataSet;
                        FormGrid_2 frm2 = new FormGrid_2();
                        frm2.tabela = dt.Tables[0];
                        frm2.Show();
                    }
                }
                //PARA CLONAR SEGUNDO DATAGRIDVIEW
                //PARA CLONAR AS COLUNAS
                for (int i = 0; i < grid_coord.Columns.Count; i++)
                {

                    var novaColuna = (DataGridViewColumn)grid_coord.Columns[i].Clone();
                    FormGrid_2.grid_Ccoord.Columns.Add(novaColuna);
                }

                //PERCORRE CADA LINHA DO GRID ANTIGO, OBTEM SEUS VALORES E ADICIONA NO GRID NOVO
                for (int indexLinha = 0; indexLinha < grid_coord.RowCount; indexLinha++)
                {
                    //CLONA A LINHA E CRIA AS CELULAS
                    var novaLinha = new DataGridViewRow();
                    novaLinha.CreateCells(grid_coord);
                    FormGrid_2.grid_Ccoord.Rows.Add(novaLinha);

                    //CLONA OS VALORES DAS CELULAS
                    for (int indexColuna = 0; indexColuna < grid_coord.Columns.Count; indexColuna++)
                    {
                        FormGrid_2.grid_Ccoord[indexColuna, indexLinha].Value = grid_coord[indexColuna, indexLinha].Value;
                    }
                }

    No Form1, o primeiro datagridview é grid_tipo (que recebe os dados do banco de dados), o segundo é grid_coord (que recebe dados de um textbox). No Fom2, o primeiro datagridview é grid_Ctipo e o segundo é grid_Ccoord.

    Mais uma vez muito obrigado pela sua atenção e paciencia comigo que sou iniciante e não domino a ferramenta.

    terça-feira, 1 de maio de 2012 02:24
  • Fiz um projeto igual o seu, portanto esse código está testado. Não esqueça de mudar a propriedade modifiers dos dois DataDrids do Form2 para public.

    private void bt_copiar2_Click(object sender, EventArgs e) { //INSTANCIA O FORM2 FormGrid_2 frm2 = new FormGrid_2(); //CLONA PRIMEIRO DATAGRIDVIEW frm2.grid_Ctipo.DataSource = grid_tipo.DataSource; ; //PARA CLONAR SEGUNDO DATAGRIDVIEW //PARA CLONAR AS COLUNAS for (int i = 0; i < grid_coord.Columns.Count; i++) { var novaColuna = (DataGridViewColumn)grid_coord.Columns[i].Clone(); frm2.grid_Ccoord.Columns.Add(novaColuna); } //PERCORRE CADA LINHA DO GRID ANTIGO, OBTEM SEUS VALORES E ADICIONA NO GRID NOVO for (int indexLinha = 0; indexLinha < grid_coord.RowCount; indexLinha++) { //CLONA A LINHA E CRIA AS CELULAS var novaLinha = new DataGridViewRow(); novaLinha.CreateCells(grid_coord); frm2.grid_Ccoord.Rows.Add(novaLinha); //CLONA OS VALORES DAS CELULAS for (int indexColuna = 0; indexColuna < grid_coord.Columns.Count; indexColuna++) { frm2.grid_Ccoord[indexColuna, indexLinha].Value = grid_coord[indexColuna, indexLinha].Value; } }

    //EXIBE O FORM2 COM OS GRIDS CLONADOS frm2.Show(); }


    Não esqueça de marcar a resposta e as publicações uteis ;)


    terça-feira, 1 de maio de 2012 14:46
  • Renato,

    Muito obrigado pela excelente ajuda que vc me disponibilizou.

    Funcionou perfeitamente.

    Grande abraço e bom dia do trabalho a vc.

    Mais uma vez obrigado.

    Gabryel

    terça-feira, 1 de maio de 2012 15:19
  • Tendo duvidas é só postar. O fórum está cheio de possas que gostam de compartilhar conhecimento e ideias.

    Só uma observação: Você me desejou bom trabalho, mais hoje é feriado e estou em casa hehehehe

    Valeu.

    terça-feira, 1 de maio de 2012 15:40
  • Mais uma vez obrigado

    Desejei a vc Bom Dia do Trabalho...

    Abraço...

    terça-feira, 1 de maio de 2012 16:31