Array
(
)

Preenchimento de DataTable vazio causando indexOutOfRangeException

Tiago
   - 05 jan 2010

  Boa noite. Estou tentando gerar uma tabela dinamicamente a partir de consultas que podem me retornar mais de uma tabela:
*****************************************************************************************
      public DataTable montarTabelaPassAuxiliar(String auxiliarNom)
        {
            DataTable tabAuxiliar = new DataTable();
            DataTable tabCooperado = new DataTable();
            DataTable tabelaCarros = new DataTable();
            DataTable tabAuxiliarCarr = new DataTable();

            AuxiliarDAO daoAuxiliar = new AuxiliarDAO();
            CooperadoDAO daoCooperado = new CooperadoDAO();
            int kx = 0;
            int ky = 0;

            tabAuxiliar = daoAuxiliar.consultar(auxiliarNom);
            if (tabAuxiliar.Rows.Count > 0)
                for (int i = 0; i < tabAuxiliar.Rows.Count; i++)
                {                   
                    tabCooperado = daoCooperado.consultar(int.Parse(tabAuxiliar.Rows[i]["idCooperado"].ToString()));
                    if (tabCooperado.Rows.Count > 0)
                    {

                        tabAuxiliarCarr = this.montarTabelaPassCooperado(tabCooperado.Rows[0]["nome"].ToString());
                        tabelaCarros = tabAuxiliarCarr.Copy();
                       
                        for (int j = 0; j < tabAuxiliarCarr.Rows.Count; j++, kx++)
                        {
                            if (kx > 0) tabelaCarros.NewRow();
                            ky = 0;
                            for(int k = 0; k < tabAuxiliarCarr.Columns.Count; k++, ky++)
                            {
                --->>>      tabelaCarros.Rows[kx][ky] = tabAuxiliarCarr.Rows[j][k];
                            }
                        }
                    }                   
                }
            return tabelaCarros;       
        }
    }
*****************************************************************************************<

O problema está na linha em que marquei com setas. No array que representa a tabelaCarros, na posição 1, está acusando que não há nada! Claro que não há nada! se é exatamente onde estou tentando colocar!!!! Alguém tem uma sugestão?

demasiado grado 

Netasper
   - 06 jan 2010

Amigo, abre um chamado aqui mesmo, o pessoal responde para vc isto.... tem que responder ate achar a solução... []s

Tiago
   - 06 jan 2010

  Certo. Mas me parece que isso já é um chamado aberto, não?

grato

Tiago
   - 07 jan 2010

  Boa noite. Resolvi o problema criando um dataRow com a mesma estrutura da tabela(row = tabAuxiliarCarr.NewRow()), percorrendo os mesmos, populando o row com os dados das colunas da tabela, e, por fim, adicionando o row na tabela a resultante a ser retornada.

Tiago
   - 07 jan 2010

  Boa noite. Resolvi o problema criando um dataRow com a mesma estrutura da tabela(row = tabAuxiliarCarr.NewRow()), percorrendo os mesmos, populando o row com os dados das colunas da tabela, e, por fim, adicionando o row na tabela a resultante a ser retornada.

Tiago
   - 07 jan 2010

  O código:

        public DataTable montarTabelaPassAuxiliar(String auxiliarNom)
        {
            DataTable tabAuxiliar = new DataTable();
            DataTable tabCooperado = new DataTable();
            DataTable tabelaCarros = new DataTable();
            DataTable tabAuxiliarCarr = new DataTable();

            AuxiliarDAO daoAuxiliar = new AuxiliarDAO();
            CooperadoDAO daoCooperado = new CooperadoDAO();
                     

            tabAuxiliar = daoAuxiliar.consultar(auxiliarNom);
            if (tabAuxiliar.Rows.Count > 0)
                for (int i = 0; i < tabAuxiliar.Rows.Count; i++)
                {                   
                    tabCooperado = daoCooperado.consultar(int.Parse(tabAuxiliar.Rows[i]["idCooperado"].ToString()));
                    if (tabCooperado.Rows.Count > 0)
                    {
                        tabAuxiliarCarr = this.montarTabelaPassCooperado(tabCooperado.Rows[0]["nome"].ToString());
                       
                        if (tabAuxiliarCarr.Rows.Count > 0)
                        {
                            if (tabelaCarros.Rows.Count == 0)
                                tabelaCarros = tabAuxiliarCarr.Copy();
                            else
                            {
                                DataRow row = tabelaCarros.NewRow();
                                for (int j = 0; j < tabAuxiliarCarr.Rows.Count; j++)
                                {
                                    for (int k = 0; k < tabAuxiliarCarr.Columns.Count; k++)
                                    {
                                        row[k] = tabAuxiliarCarr.Rows[j][k];                                                                         
                                    }
                                    tabelaCarros.Rows.Add(row);
                                }                               
                            }
                        }
                    }           
                }
            return tabelaCarros;       
        }

A propósito, como faço pra fechar o chamado nesse site?
grato.

Netasper
   - 07 jan 2010

Legal que conseguiu!´[]s

Paulo Sena
   - 08 jan 2010

A partir do VS2005 vc pode utilizar o linq para otimizar essa sua consulta. 

Eleuterio Gonzalez
   - 16 fev 2010

parabens ficou legal