none
Obtendo todas as linhas de um DataGrid RRS feed

  • Pergunta

  • Pessoal, estou com um enorme desafio, Tenho um DataGrid com varios itens dentro. Eu precisava recuperar todos esses items e jogar no meu banco PostgreSQL. Mas como farei isso? 

    Eu não sei quantas linhas estão no datagrid.

    Alguem me ajude?

    Class AtribuicaoVaga - Onde eu consulto os dados de minha DataGrid e envio de volta para a tela anteior:

    IList<perfilVagas> _editList = new ObservableCollection<perfilVagas>();
            public IList<perfilVagas> EditList
            {
                get
                {
                    return _editList;
                }
            }
    
            perfilVagas p = new perfilVagas();
    
            public void ObterDadosSelecionados()
            {
                Object item = dataGridAtribuicaoVaga.SelectedItem;
                atribuicao = new Atribuicao();
    
                cod = Convert.ToInt32((dataGridAtribuicaoVaga.SelectedCells[0].Column.GetCellContent(item) as TextBlock).Text);
                desc = (dataGridAtribuicaoVaga.SelectedCells[1].Column.GetCellContent(item) as TextBlock).Text;
                min = Convert.ToInt32((dataGridAtribuicaoVaga.SelectedCells[2].Column.GetCellContent(item) as TextBlock).Text);
                med = Convert.ToInt32((dataGridAtribuicaoVaga.SelectedCells[3].Column.GetCellContent(item) as TextBlock).Text);
                max = Convert.ToInt32((dataGridAtribuicaoVaga.SelectedCells[4].Column.GetCellContent(item) as TextBlock).Text);
                
                p = new perfilVagas();
    
                p.CodigoAtribuicao = cod;
                p.DescricaoAtribuicao = desc;
                p.PontuacaoMin = min;
                p.PontuacaoMed = med;
                p.PontuacaoMax = max;
    
                _editList.Add(p);
                
                MIN = Convert.ToString(TotalPontuacaoMin2(_editList));
                MED = Convert.ToString(TotalPontuacaoMed2(_editList));
                MAX = Convert.ToString(TotalPontuacaoMax2(_editList));
    
                //atribuicao.Descricao = _editList;
    
                valor = true;
            }

    Class PerfilVaga - Onde eu Obtenho os dados recuperados da AtribuicaoVaga e jogo para a DataGrid

    private void textCodigoAtribuicoes_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.F2){
                    atribVagas = new Consultas.AtribuicaoVaga();
                    atribVagas.ShowDialog();
    
                    textCodigoAtribuicoes.Text = Convert.ToString(atribVagas.Guia);
    
                    dataGridPerfilVaga.ItemsSource = atribVagas.EditList;
                    //dataGridPerfilVaga.ItemsSource = atribVagas.Descricao;
    
                    textCodigoAtribuicoes.Clear();
                    textCodigoAtribuicoes.Focus();
    
                    textMin.Text = atribVagas.MIN;
                    textMed.Text = atribVagas.MED;
                    textMax.Text = atribVagas.MAX;
                }
            }

    E onde eu preciso salvar os meus dados que estão na DataGrid da Class PerfilVaga:

    private async void btnSalvarPerfilVaga_Click(object sender, RoutedEventArgs e)
            {
                perVaga = new Modelos.PerfilVaga();
                dao = new Dao.PerfilVagaDao();
    
                if (textCodigoVaga.Text == string.Empty || textDescricaoVaga.Text == string.Empty)
                {
                    await mensagemSimples(textCodigoVaga, "Campos Obrigatórios", "Código da Vaga\nDescrição da Vaga");
                }
                else
                {
                    dao = new Dao.PerfilVagaDao();
                    Modelos.PerfilVaga perfVaga = new Modelos.PerfilVaga();
    
                    perfVaga.CodigoItemAtribuicao = Convert.ToInt32(textCodigoVaga.Text);
                    perfVaga.DescricaoVaga = textDescricaoVaga.Text;
                    perfVaga.Data = Convert.ToDateTime(textData.Text);
                    perfVaga.InformacoesAdicionais = textInfAdd.Text;
    
                    foreach (var linha in this.dataGridPerfilVaga.Items)
                    {
                        meusObjetosNoDatagrid.Add(linha as PerfilVaga); //Aqui você faz o cast para qual tipo de objeto está na sua lista
                    }
    
                    dataGridPerfilVaga.ItemsSource = meusObjetosNoDatagrid;
                }
            }


    • Editado EmersonJau sexta-feira, 12 de junho de 2015 17:51
    quinta-feira, 11 de junho de 2015 16:56

Respostas

  • Tu precisa definir essa tua classe PerfilVagaAtribuicoes pública.

    Provavelmente tua classe deve estar assim hoje.

    class PerfilVagaAtribuicoes
    {
     //....
    }

    Ela deve ficar assim.

    public class PerfilVagaAtribuicoes
    {
     //....
    }

    • Marcado como Resposta EmersonJau sexta-feira, 12 de junho de 2015 19:11
    sexta-feira, 12 de junho de 2015 18:29
  • Seria isso mesmo, o que está acontecendo?
    sexta-feira, 12 de junho de 2015 18:52
  • O problema acontece pois o método dao.adicionarAtribuicaoPerfil(meusObjetosNoDatagrid) ele espera um objeto do tipo PerfilVagaAtribuicoes e você está passando uma lista para ele.

    O código abaixo deve resolver teu problema.

    foreach (var linha in this.dataGridPerfilVaga.Items)
                    {
                        dao.adicionarAtribuicaoPerfil(linha as Modelos.PerfilVagaAtribuicoes);
                    }

    • Marcado como Resposta EmersonJau sexta-feira, 12 de junho de 2015 19:11
    sexta-feira, 12 de junho de 2015 18:59

Todas as Respostas

  • Olá EmersonJau, da uma olhada no código abaixo e ve se lhe auxilia.

    List<string> meusObjetosNoDatagrid = new List<string>();
    
                foreach (var linha in this.dt.Items)
                {
                    meusObjetosNoDatagrid.Add(linha as string); //Aqui você faz o cast para qual tipo de objeto está na sua lista
                }




    quinta-feira, 11 de junho de 2015 18:13
  • Bruno, eu deixei dessa maneira:

    List<PerfilVaga> meusObjetosNoDatagrid = new List<PerfilVaga>();

    foreach (var linha in this.dataGridPerfilVaga.Items) { meusObjetosNoDatagrid.Add(linha as PerfilVaga); //Aqui você faz o cast para qual tipo de objeto está na sua lista }

    Dai tentei chamá-lo de volta ao dataGrid para ver se ele pegou os dados mas deu erro. Eu chamei ao dataGrid dessa forma:

    dataGridPerfilVaga.ItemsSource = meusObjetosNoDatagrid;

    Esta correto da forma que fiz?

    sexta-feira, 12 de junho de 2015 16:35
  • Olá EmersonJau,

     qual o erro ? A forma como se lê os itens depende de como popula seu datagrid, poste como está sendo populado.

    sexta-feira, 12 de junho de 2015 16:40
  • Da o erro Value cannot be null.

    Esta muito confuso aqui, mas vamos la... =/

    Eu fui a tela de consuta quando pressionava a tecla F2 e selecionava os dados e armazenada em um IList. E retorneu dessa maneira:

    if (e.Key == Key.F2){
                    atribVagas = new Consultas.AtribuicaoVaga();
                    atribVagas.ShowDialog();
    
                    dataGridPerfilVaga.ItemsSource = atribVagas.Descricao;
                }

    Maneira de como eu peguei os valores:

    IList<perfilVagas> _editList = new ObservableCollection<perfilVagas>();
    perfilVagas p = new perfilVagas();
    public void ObterDadosSelecionados()
            {
                Object item = dataGridAtribuicaoVaga.SelectedItem;
                atribuicao = new Atribuicao();
    
                desc = (dataGridAtribuicaoVaga.SelectedCells[1].Column.GetCellContent(item) as TextBlock).Text;
                p = new perfilVagas();
    
                p.DescricaoAtribuicao = desc;
    
                _editList.Add(p);
                
                atribuicao.Descricao = _editList;
    
                valor = true;
            }

    Sou novato e acabei fazendo de uma maneira muito confusa =/





    • Editado EmersonJau sexta-feira, 12 de junho de 2015 16:50
    sexta-feira, 12 de junho de 2015 16:45
  • Tenta depurar essa linha de código e ve se o cast não está retornando null.

    meusObjetosNoDatagrid.Add(linha as PerfilVaga)

    sexta-feira, 12 de junho de 2015 16:52
  • Alguma dica de como fazer isso? (Desculpa =/)
    sexta-feira, 12 de junho de 2015 17:07
  • Coloca um breakpoint nessa linha (clica na linha e aperta F9), depois executa, quando essa linha for ser executada, o programa vai parar nessa linha, dai tu verifica que tipo de objeto é o linha
    sexta-feira, 12 de junho de 2015 17:12
  • Selecionei 4 itens.

    Ele mostrou que os 4 são null... 

    sexta-feira, 12 de junho de 2015 17:17
  • Coloca um breakpoint nessa linha (clica na linha e aperta F9), depois executa, quando essa linha for ser executada, o programa vai parar nessa linha, dai tu verifica que tipo de objeto é o linha

     Bruno,

     está nulo sim, repare que quando ele atribui o valor ao grid ele atribui uma variavel chamada "Descricao", deve ser do tipo string ou não, quando tenta ler, ele faz o cast de PerfilVaga, mas o que foi adicionado é somente a "Descricao" do PerfilVaga.

    sexta-feira, 12 de junho de 2015 17:18
  • Eu fiz um BreakPoint tambem na linha:

    dataGridPerfilVaga.ItemsSource = atribVagas.Descricao;

    Lá mostou os dados que eu precisava. =/

    sexta-feira, 12 de junho de 2015 17:21
  • Coloca um breakpoint nessa linha (clica na linha e aperta F9), depois executa, quando essa linha for ser executada, o programa vai parar nessa linha, dai tu verifica que tipo de objeto é o linha

     Bruno,

     está nulo sim, repare que quando ele atribui o valor ao grid ele atribui uma variavel chamada "Descricao", deve ser do tipo string ou não, quando tenta ler, ele faz o cast de PerfilVaga, mas o que foi adicionado é somente a "Descricao" do PerfilVaga.

    Verdade Daniel, não tinha reparado isso.

    Emerson, na hora de setar o DataSource, por que você não seta com o objeto _editList?

    if (e.Key == Key.F2){
                    atribVagas = new Consultas.AtribuicaoVaga();
                    atribVagas.ShowDialog();
    
                    dataGridPerfilVaga.ItemsSource = atribVagas.EditList;
                }

    IList<perfilVagas> _editList = new ObservableCollection<perfilVagas>();
    public IList<perfilVagas> EditList
    {
       get
    {
        return _editList;
    }
    }
    
    perfilVagas p = new perfilVagas();
    public void ObterDadosSelecionados()
            {
                Object item = dataGridAtribuicaoVaga.SelectedItem;
                atribuicao = new Atribuicao();
    
                desc = (dataGridAtribuicaoVaga.SelectedCells[1].Column.GetCellContent(item) as TextBlock).Text;
                p = new perfilVagas();
    
                p.DescricaoAtribuicao = desc;
    
                _editList.Add(p);
                
    
                valor = true;
            }

    sexta-feira, 12 de junho de 2015 17:24
  • Tentei dessa maneira, fiz o BreakPoint e me trouxe null ainda...

    Já nesta linha ele trouxe tudo:

    dataGridPerfilVaga.ItemsSource = atribVagas.EditList;

    Meu código ta muito confuso. Se for ver eu teria que começar tudo denovo.


    • Editado EmersonJau sexta-feira, 12 de junho de 2015 17:36
    sexta-feira, 12 de junho de 2015 17:34
  • Nesta linda esta null:

    dataGridPerfilVaga.ItemsSource = meusObjetosNoDatagrid;
    Editei no meu primeiro post
    • Editado EmersonJau sexta-feira, 12 de junho de 2015 17:52
    sexta-feira, 12 de junho de 2015 17:45
  • Você tem dois tipos objetos perfilVagas e PerfilVaga ou foi só um erro de digitação?

    Caso seja dois objetos diferentes, a lista _editList tem que ser do tipo PerfilVaga para que você consiga fazer o cast corretamente.

    IList<PerfilVaga> _editList = new ObservableCollection<PerfilVaga>();
    sexta-feira, 12 de junho de 2015 17:58
  • Não é erro de digitação não..

    To perdidinho cara, desculpa

    sexta-feira, 12 de junho de 2015 18:02
  • O problema tá acontecendo que tu tá setando o DataSource com um tipo de objeto e fazendo o cast para outro tipo.

    foreach (var linha in this.dataGridPerfilVaga.Items)
                    {
                        meusObjetosNoDatagrid.Add(linha as PerfilVaga); //Aqui você faz o cast para qual tipo de objeto está na sua lista
                    }


    IList<perfilVagas> _editList = new ObservableCollection<perfilVagas>();
            public IList<perfilVagas> EditList
            {
                get
                {
                    return _editList;
                }
            }

    perfilVagas e PerfilVaga são diferentes, por isso na hora do cast ele retorna null.

    Define só um tipo de objeto e usa ele nos dois casos acima que deve funcionar.

    sexta-feira, 12 de junho de 2015 18:12
  • Tentei definir todos eles para um mesmo objeto chamado "Modelos.PerfilVagaAtribuicoes". Mas aparece um erro indicando o EditList

    public IList<Modelos.PerfilVagaAtribuicoes> EditList
            {
                get
                {
                    return _editList;
                }
            }
    Inconsistent accessibility: property type 'System.Collections.Generic.IList<Curriculos.Modelos.PerfilVagaAtribuicoes>' is less accessible than property

    sexta-feira, 12 de junho de 2015 18:26
  • Tu precisa definir essa tua classe PerfilVagaAtribuicoes pública.

    Provavelmente tua classe deve estar assim hoje.

    class PerfilVagaAtribuicoes
    {
     //....
    }

    Ela deve ficar assim.

    public class PerfilVagaAtribuicoes
    {
     //....
    }

    • Marcado como Resposta EmersonJau sexta-feira, 12 de junho de 2015 19:11
    sexta-feira, 12 de junho de 2015 18:29
  • Desculpa a demora Bruno, estava ajeitando aqui e realmente deu certo dessa forma.. Obrigado.

    Agora pra eu adicionar no banco, eu precisava desses items como sendo do tipo Modelos.PerfilVagaAtribuicoes

    Alguma forma de converter ou algo parecido?

    Tentei dessa forma:

    foreach (var linha in this.dataGridPerfilVaga.Items)
                    {
                        meusObjetosNoDatagrid.Add(linha as Modelos.PerfilVagaAtribuicoes); //Aqui você faz o cast para qual tipo de objeto está na sua lista
                        dao.adicionarAtribuicaoPerfil(meusObjetosNoDatagrid);
                    }

    sexta-feira, 12 de junho de 2015 18:49
  • Seria isso mesmo, o que está acontecendo?
    sexta-feira, 12 de junho de 2015 18:52
  • Da esses dois erros. O primeiro é no "meusObjetosNoDatagrid"

    O segundo é no "adicionarAtribuicaoPerfil()"

    Argument 1: cannot convert from 'System.Collections.Generic.List<Curriculos.Modelos.PerfilVagaAtribuicoes>' to 'Curriculos.Modelos.PerfilVagaAtribuicoes'

    The best overloaded method match for 'Curriculos.Dao.PerfilVagaDao.adicionarAtribuicaoPerfil(Curriculos.Modelos.PerfilVagaAtribuicoes)' has some invalid arguments
    sexta-feira, 12 de junho de 2015 18:56
  • O problema acontece pois o método dao.adicionarAtribuicaoPerfil(meusObjetosNoDatagrid) ele espera um objeto do tipo PerfilVagaAtribuicoes e você está passando uma lista para ele.

    O código abaixo deve resolver teu problema.

    foreach (var linha in this.dataGridPerfilVaga.Items)
                    {
                        dao.adicionarAtribuicaoPerfil(linha as Modelos.PerfilVagaAtribuicoes);
                    }

    • Marcado como Resposta EmersonJau sexta-feira, 12 de junho de 2015 19:11
    sexta-feira, 12 de junho de 2015 18:59
  • Cara, vc é um gênio? hahahah

    Funcionou perfeitamente cara.  Muito Obrigado!!!!! ^^

    sexta-feira, 12 de junho de 2015 19:05
  • Legal, feliz em ajudar.

    Só não esqueça de votar como útil e marcar como resposta.

    Abraço!

    sexta-feira, 12 de junho de 2015 19:05
  • Cara, marca todos como resposta? hahah

    Abraço!


    • Editado EmersonJau sexta-feira, 12 de junho de 2015 19:12
    sexta-feira, 12 de junho de 2015 19:11