none
Passando DataGridView Por Parâmetro a Uma Classe RRS feed

  • Pergunta

  • Galera boa noite!

    No código abaixo se eu colocar no evento ao clicar de um botão ele exporta todo conteúdo de um DataGridView para uma planilha de Excel sem problemas. Porém precisei passar o mesmo para uma classe afim de reutilizá - lo várias vezes, assim não preciso copiá - lo em vários formulários.

    Ocorre que ao chama - lo aparece a seguinte mensagem: "Referencia de Objeto não definida para uma instancia de um objeto".

    Seguem os dados:

    No botão coloquei no evento ao clicar:

    private void dataGridExcel(object sender, EventArgs e)
    {            
          Excel Excell = new Excel();
          Excell.ExportaExcel((sender as DataGridView));  
    }

    Na classe:

    class Excel
        {
            public void ExportaExcel(DataGridView dataGridView1)
            {
                Microsoft.Office.Interop.Excel.Application Excel = new Microsoft.Office.Interop.Excel.Application();
                
                try
                {
                    Excel.Application.Workbooks.Add(Type.Missing);
                    for (int i = 1; i < dataGridView1.Columns.Count + 1; i++)
                    {
                        Excel.Cells[1, i] = dataGridView1.Columns[i - 1].HeaderText;
                    }
    
                    for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
                    {
                        for (int j = 0; j < dataGridView1.Columns.Count; j++)
                        {
                            Excel.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
                        }
                    }
                    Excel.Columns.AutoFit();
                    Excel.Visible = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(" Erro na exportação para o excel:\n " + ex.Message);
                    Excel.Quit();
                }  
            }
        }

    Gostaria de saber como resolver este problema, lembrando que eu fiz a referencia do Excel no sistema

    Desde já agradeço.


    • Editado Long_beach01 sexta-feira, 6 de novembro de 2015 00:42 Falta de conteúdo
    sexta-feira, 6 de novembro de 2015 00:41

Respostas

  • Capaz, todo mundo já passou por isso. :)

    Abaixo da resposta deve ter um link: "Marcar como resposta" ou algo do tipo, só clicar ali.


    Att., Rafael Simor

    • Marcado como Resposta Long_beach01 sábado, 7 de novembro de 2015 00:51
    sexta-feira, 6 de novembro de 2015 16:10
  • O erro diz tudo, voce precisa instanciar o teu datagridview1,

    Datagridview1 = new Datagridview();

    codigo....

    public void ExportaExcel(DataGridView dataGridView1)

    {

    dataGridView1 = new Datagridview();

    }


    A flower cannot blossom without sunshine, and man cannot live without love.

    Levi, isto resolveria a exceção (DataGridView não instanciado), porém não seria usual, levando em conta que os dados serão extraídos deste controle e, desta forma, o Source estaria vazio.

    Att., Rafael Simor

    • Marcado como Resposta Marcos SJ sexta-feira, 6 de novembro de 2015 18:03
    sexta-feira, 6 de novembro de 2015 15:23
  • Não é para passar "DataGrid" como parâmetro, mas sim o nome da tua DataGrid (dataGridView1, provavelmente):

    private void dataGridExcel(object sender, EventArgs e)
    {            
          Excel Excell = new Excel();
          Excell.ExportaExcel(dataGridView1);  
    }
    Porém, como comentei anteriormente, o ideal seria pegar a fonte de dados e trabalhar com ela (no caso, no método ExportaExcel não iria mais usar .Rows e .Columns, iria usar os atributos dos objetos da Source.

    Att., Rafael Simor

    • Sugerido como Resposta SimorC sexta-feira, 6 de novembro de 2015 17:52
    • Marcado como Resposta Marcos SJ sexta-feira, 6 de novembro de 2015 18:03
    sexta-feira, 6 de novembro de 2015 15:52

Todas as Respostas

  • Boa noite.

    Tente passar como parâmetro o Source do DataGridView, não o controle em si.

    Se mesmo assim não der certo, tente identificar a linha do erro, assim fica mais fácil de ajudarmos, mas se eu tivesse que tentar adivinhar, diria que o problema é nesse for com o .Count +1.


    Att., Rafael Simor

    • Marcado como Resposta Marcos SJ sexta-feira, 6 de novembro de 2015 11:24
    • Não Marcado como Resposta Marcos SJ sexta-feira, 6 de novembro de 2015 12:54
    sexta-feira, 6 de novembro de 2015 01:56
  • Bom dia!

    Então, só aparece este erro ele não mostra a linha, agora se eu colocar ele com uma condição if conforme abaixo ele aparece o erro logo na primeira linha:

    if (dataGridView1.Rows.Count > 0) //-> nesta linha com a mesma mensagem
    {
    }

    Eu usei o comando sender para passar o objeto para classe mais me parece que ele esta enxergando o objeto como parâmetro.

    Com relação ao source, sou novo em C# não consegui entender, se houver a possibilidade de me informar como fazê - lo eu agradeço

    sexta-feira, 6 de novembro de 2015 11:58
  • Bom dia.

    No lugar de (sender as DataGridView), se tu passares o nome do DataGrid, o problema, possivelmente, se resolveria, pois o sender pega o controle que chamou o evento (no teu caso, provavelmente um botão).

    Mas voltando ao source:

    DataSource é a fonte de dados que popula tua Grid, a lista de objetos que gera os dados dela.

    Fiz um exemplo simples onde eu pego a Source de uma grid e populo outra:

    private void Form1_Load(object sender, EventArgs e) { dataGridView1.DataSource = Teste.GetLista(10); } private void button1_Click(object sender, EventArgs e) { List<Teste> lstTeste = (List<Teste>)dataGridView1.DataSource; dataGridView2.DataSource = lstTeste;

    }

    Tente usar os dados do DataSource como parâmetro, não a Grid inteira.


    Att., Rafael Simor

    • Sugerido como Resposta SimorC sexta-feira, 6 de novembro de 2015 17:52
    sexta-feira, 6 de novembro de 2015 13:39
  • O erro diz tudo, voce precisa instanciar o teu datagridview1,

    Datagridview1 = new Datagridview();

    codigo....

    public void ExportaExcel(DataGridView dataGridView1)

    {

    dataGridView1 = new Datagridview();

    }


    A flower cannot blossom without sunshine, and man cannot live without love.

    • Sugerido como Resposta Marcos SJ sexta-feira, 6 de novembro de 2015 15:06
    • Não Sugerido como Resposta Marcos SJ sexta-feira, 6 de novembro de 2015 15:33
    sexta-feira, 6 de novembro de 2015 13:59
    Moderador
  • O erro diz tudo, voce precisa instanciar o teu datagridview1,

    Datagridview1 = new Datagridview();

    codigo....

    public void ExportaExcel(DataGridView dataGridView1)

    {

    dataGridView1 = new Datagridview();

    }


    A flower cannot blossom without sunshine, and man cannot live without love.

    Levi, isto resolveria a exceção (DataGridView não instanciado), porém não seria usual, levando em conta que os dados serão extraídos deste controle e, desta forma, o Source estaria vazio.

    Att., Rafael Simor

    • Marcado como Resposta Marcos SJ sexta-feira, 6 de novembro de 2015 18:03
    sexta-feira, 6 de novembro de 2015 15:23
  • O erro diz tudo, voce precisa instanciar o teu datagridview1,

    Datagridview1 = new Datagridview();

    codigo....

    public void ExportaExcel(DataGridView dataGridView1)

    {

    dataGridView1 = new Datagridview();

    }


    A flower cannot blossom without sunshine, and man cannot live without love.

    Boa tarde!

    Colega eu fiz o instanciamento mais ele quebrou a referencia, pois salvou uma planilha de excel vazia

    sexta-feira, 6 de novembro de 2015 15:47
  • Bom dia.

    No lugar de (sender as DataGridView), se tu passares o nome do DataGrid, o problema, possivelmente, se resolveria, pois o sender pega o controle que chamou o evento (no teu caso, provavelmente um botão).

    Mas voltando ao source:

    DataSource é a fonte de dados que popula tua Grid, a lista de objetos que gera os dados dela.

    Fiz um exemplo simples onde eu pego a Source de uma grid e populo outra:

    private void Form1_Load(object sender, EventArgs e) { dataGridView1.DataSource = Teste.GetLista(10); } private void button1_Click(object sender, EventArgs e) { List<Teste> lstTeste = (List<Teste>)dataGridView1.DataSource; dataGridView2.DataSource = lstTeste;

    }

    Tente usar os dados do DataSource como parâmetro, não a Grid inteira.


    Att., Rafael Simor

    Boa tarde!

    Como Datagrid os Rows e Columns ficam dando erro.

    sexta-feira, 6 de novembro de 2015 15:48
  • Não é para passar "DataGrid" como parâmetro, mas sim o nome da tua DataGrid (dataGridView1, provavelmente):

    private void dataGridExcel(object sender, EventArgs e)
    {            
          Excel Excell = new Excel();
          Excell.ExportaExcel(dataGridView1);  
    }
    Porém, como comentei anteriormente, o ideal seria pegar a fonte de dados e trabalhar com ela (no caso, no método ExportaExcel não iria mais usar .Rows e .Columns, iria usar os atributos dos objetos da Source.

    Att., Rafael Simor

    • Sugerido como Resposta SimorC sexta-feira, 6 de novembro de 2015 17:52
    • Marcado como Resposta Marcos SJ sexta-feira, 6 de novembro de 2015 18:03
    sexta-feira, 6 de novembro de 2015 15:52
  • Não é para passar "DataGrid" como parâmetro, mas sim o nome da tua DataGrid (dataGridView1, provavelmente):

    private void dataGridExcel(object sender, EventArgs e)
    {            
          Excel Excell = new Excel();
          Excell.ExportaExcel(dataGridView1);  
    }
    Porém, como comentei anteriormente, o ideal seria pegar a fonte de dados e trabalhar com ela (no caso, no método ExportaExcel não iria mais usar .Rows e .Columns, iria usar os atributos dos objetos da Source.

    Att., Rafael Simor

    Oi, quando agente esta aprendendo é fogo, deu certo, resolvido o problema, como eu coloco resolvido neste tópico?
    sexta-feira, 6 de novembro de 2015 16:09
  • Capaz, todo mundo já passou por isso. :)

    Abaixo da resposta deve ter um link: "Marcar como resposta" ou algo do tipo, só clicar ali.


    Att., Rafael Simor

    • Marcado como Resposta Long_beach01 sábado, 7 de novembro de 2015 00:51
    sexta-feira, 6 de novembro de 2015 16:10