Usuário com melhor resposta
Clonar dados de um DataGridView em C#

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
- Movido C. Augusto Proiete [MVP]Moderator quinta-feira, 26 de abril de 2012 12:15 Movido para o forum apropriado (De:C#)
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 ;)
- Editado Renato Coqueiro terça-feira, 1 de maio de 2012 14:46
- Marcado como Resposta Gabryel_Gabryel terça-feira, 1 de maio de 2012 15:17
Todas as Respostas
-
-
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 ;)
- Editado Renato Coqueiro sexta-feira, 27 de abril de 2012 18:09
-
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
-
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(); }
- Editado Renato Coqueiro sábado, 28 de abril de 2012 14:10
-
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
-
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.
- Editado Renato Coqueiro segunda-feira, 30 de abril de 2012 11:00
-
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.
-
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 ;)
- Editado Renato Coqueiro terça-feira, 1 de maio de 2012 14:46
- Marcado como Resposta Gabryel_Gabryel terça-feira, 1 de maio de 2012 15:17
-
-
-