none
realizar select dos dados de uma GridView RRS feed

  • Pergunta

  • Olá galera, seguinte tenho uma aplicação Asp.Net C# onde carrego uma GridView com dados do Excel, até aí sem dificuldades.Porém necessito fazer um select nesses dador.

    Nessa gridView contem em cada linha dado de passageiro e do pagador, porém nem sempre será o mesmo pagador.
    EX: há 50 passageiros listados na GridView os 10 primeiro são do pagador A os 10 seguintes são do pagador B e os outro 30 são do pagados C, preciso informar para um WebService os passageiros de cada pagador. Seguinte, devo informar que para o pagador A eu tenho uma lista de 10 passageiros, para o pagador B os outros 10, e assim por diante.Minha dificuldade está bem no inicio, não sei como realizar esse select e separar esses dados, já tentei select no dataTable e no DataSet não não funciona.

    Alguém pode me ajudar ?

    sexta-feira, 4 de setembro de 2015 11:48

Respostas

  • Tem também o DataView. Você pode usar algo do tipo

    DataView dataView = new DataView();
    dataView.Table = dataSet.Tables["Tabela"]; //Aqui você coloca a sua tabela
    dataView.RowFilter = "Pagador = A"; //Aqui vai o filtro 
    dataView.Sort = "Pagador"; //Se quiser ordenar vai aqui o campo
    

    Veja se isto ajuda.

    Abraço

    sexta-feira, 4 de setembro de 2015 13:20
  • Sem problemas. Você está no caminho de uma das possibilidades. Abaixo, segue uma das alternativas:

    List<int> lstPagador = dataGridView1.Rows.Cast<DataGridViewRow>().Select(s => Convert.ToInt32(s.Cells["IdPagador"].Value)).Distinct().ToList();
    foreach (int idPagador in lstPagador)
    {
        //Aqui tu vai obter separadamente os dados por pagador, podendo executar a chamada do ws
        var query = dataGridView1.Rows.Cast<DataGridViewRow>().Where(i => Convert.ToInt32(i.Cells["IdPagador"].Value) == idPagador).ToList();
    }
    
    Se precisar de mais alguma explicação, pode perguntar.

    sexta-feira, 4 de setembro de 2015 14:06
  • Acho que o código abaixo pode te ajudar:

    List<string> lstPagador = gvExcelFile.Rows.Cast<GridViewRow>().Select(s => (s.Cells[11].Text.ToString())).Distinct().ToList();
    foreach (string idPagador in lstPagador)
    {
    	//Aqui tu vai obter separadamente os dados por pagador, podendo executar a chamada do ws
    	var travelers = gvExcelFile.Rows.Cast<GridViewRow>().Where(i => (i.Cells[11].Text.ToString()) == idPagador)
    	.Select(s => new Agencia.Emissao.TravelerRequest()
    		{
    			CompanyAmount = 0,
    			DateOfBirth = Convert.ToDateTime(s.Cells[7].Text.ToString().Trim()),
    			FirstName = Server.HtmlDecode(s.Cells[4].Text.ToString().Trim()),
    			LastName = Server.HtmlDecode(sCells[5].Text.ToString().Trim()),
    			IdentityDocuments = identity.ToArray(),
    			PPERelationshipCode = ""                                         
    		}
    	).ToList();
    }
    Talvez ainda tenha que adaptar algo, mas a ideia é você pegar o resultado do grid e já obter uma lista da tua classe.





    sexta-feira, 4 de setembro de 2015 15:16

Todas as Respostas

  • Olá!

       Você pode utilizar Linq:

    var query = dataGridView1.Rows.Cast<DataGridViewRow>().Where(r => r.Cells["NomeColuna1"].Value == "Critério1" && r.Cells["NomeColuna2"].Value == "Critério2").Select(s => s).ToList();

    Com Linq você pode executar quase todas as operações que faria com sql, e é muito flexível. E se tu pesquisar sobre, vai encontrar um vasto material. Mas pra começar, acho que o exemplo acima pode te ajudar. Se precisar de mais ajuda nisto, poste aqui.

    Bom trabalho!

    sexta-feira, 4 de setembro de 2015 12:57
  • Tem também o DataView. Você pode usar algo do tipo

    DataView dataView = new DataView();
    dataView.Table = dataSet.Tables["Tabela"]; //Aqui você coloca a sua tabela
    dataView.RowFilter = "Pagador = A"; //Aqui vai o filtro 
    dataView.Sort = "Pagador"; //Se quiser ordenar vai aqui o campo
    

    Veja se isto ajuda.

    Abraço

    sexta-feira, 4 de setembro de 2015 13:20
  • Olá!

       Você pode utilizar Linq:

    var query = dataGridView1.Rows.Cast<DataGridViewRow>().Where(r => r.Cells["NomeColuna1"].Value == "Critério1" && r.Cells["NomeColuna2"].Value == "Critério2").Select(s => s).ToList();

    Com Linq você pode executar quase todas as operações que faria com sql, e é muito flexível. E se tu pesquisar sobre, vai encontrar um vasto material. Mas pra começar, acho que o exemplo acima pode te ajudar. Se precisar de mais ajuda nisto, poste aqui.

    Bom trabalho!

    Olá Rodrigo.

    Eu compreendi o que envio, funcionou muito bem, porem eu preciso realizar o select tendo no WHERE o pagador, ou seja, para cada pagador eu vou ter varios passageiros, para cada select desse eu chamo o WebService,

    pensei em fazer um distinct antes para saber quem são os pagadores e depois realizar o select tendo esse distinct como filtro, mas me perdi totalmente, pode ajudar nessa ?

    Desculpa tantas duvidas, mas sou novo em C#, pouco tempo de convivencia.

    sexta-feira, 4 de setembro de 2015 13:48
  • Sem problemas. Você está no caminho de uma das possibilidades. Abaixo, segue uma das alternativas:

    List<int> lstPagador = dataGridView1.Rows.Cast<DataGridViewRow>().Select(s => Convert.ToInt32(s.Cells["IdPagador"].Value)).Distinct().ToList();
    foreach (int idPagador in lstPagador)
    {
        //Aqui tu vai obter separadamente os dados por pagador, podendo executar a chamada do ws
        var query = dataGridView1.Rows.Cast<DataGridViewRow>().Where(i => Convert.ToInt32(i.Cells["IdPagador"].Value) == idPagador).ToList();
    }
    
    Se precisar de mais alguma explicação, pode perguntar.

    sexta-feira, 4 de setembro de 2015 14:06
  • Sem problemas. Você está no caminho de uma das possibilidades. Abaixo, segue uma das alternativas:

    List<int> lstPagador = dataGridView1.Rows.Cast<DataGridViewRow>().Select(s => Convert.ToInt32(s.Cells["IdPagador"].Value)).Distinct().ToList();
    foreach (int idPagador in lstPagador)
    {
        //Aqui tu vai obter separadamente os dados por pagador, podendo executar a chamada do ws
        var query = dataGridView1.Rows.Cast<DataGridViewRow>().Where(i => Convert.ToInt32(i.Cells["IdPagador"].Value) == idPagador).ToList();
    }
    Se precisar de mais alguma explicação, pode perguntar.


    olá Rodrigo, me salvou novamente, rsrsrs
    como o pagador que eu tenho que utilizar está em uma coluna do tipo texto (CPF do Pagador), eu fiz assim
     List<string> lstPagador = gvExcelFile.Rows.Cast<GridViewRow>().Select(s => (s.Cells[11].Text.ToString())).Distinct().ToList();
                foreach (string idPagador in lstPagador)
                {
                    //Aqui tu vai obter separadamente os dados por pagador, podendo executar a chamada do ws
                    var query = gvExcelFile.Rows.Cast<GridViewRow>().Where(i => (i.Cells[11].Text.ToString()) == idPagador).ToList();
    }

    Dentro desse foreach é que eu vou tratar os dados e enviar ao WS, a ultima duvida que tenho é:
    Os passageiros desse pagador eu devo passar ao nó do WebSErvice como uma lista
    Travelers = travelers.ToArray(),

    Carrego ela assim:
    var travelers = new List<Agencia.Emissao.TravelerRequest>()
                        {
                            new Agencia.Emissao.TravelerRequest()
                            {
                                CompanyAmount = 0,
                                DateOfBirth = Convert.ToDateTime(gvExcelFile.Rows[contador].Cells[7].Text.ToString().Trim()),
                                FirstName = Server.HtmlDecode(gvExcelFile.Rows[contador].Cells[4].Text.ToString().Trim()),
                                LastName = Server.HtmlDecode(gvExcelFile.Rows[contador].Cells[5].Text.ToString().Trim()),
                                IdentityDocuments = identity.ToArray(),
                                PPERelationshipCode = "",                                         
                            }
                        };

    Como faço para passar todos esses dependentes de cada pagador sendo que nunca vai vir a mesma quantidade de pagador ?
    sexta-feira, 4 de setembro de 2015 14:46
  • Acho que o código abaixo pode te ajudar:

    List<string> lstPagador = gvExcelFile.Rows.Cast<GridViewRow>().Select(s => (s.Cells[11].Text.ToString())).Distinct().ToList();
    foreach (string idPagador in lstPagador)
    {
    	//Aqui tu vai obter separadamente os dados por pagador, podendo executar a chamada do ws
    	var travelers = gvExcelFile.Rows.Cast<GridViewRow>().Where(i => (i.Cells[11].Text.ToString()) == idPagador)
    	.Select(s => new Agencia.Emissao.TravelerRequest()
    		{
    			CompanyAmount = 0,
    			DateOfBirth = Convert.ToDateTime(s.Cells[7].Text.ToString().Trim()),
    			FirstName = Server.HtmlDecode(s.Cells[4].Text.ToString().Trim()),
    			LastName = Server.HtmlDecode(sCells[5].Text.ToString().Trim()),
    			IdentityDocuments = identity.ToArray(),
    			PPERelationshipCode = ""                                         
    		}
    	).ToList();
    }
    Talvez ainda tenha que adaptar algo, mas a ideia é você pegar o resultado do grid e já obter uma lista da tua classe.





    sexta-feira, 4 de setembro de 2015 15:16
  • Acho que o código abaixo pode te ajudar:

    List<string> lstPagador = gvExcelFile.Rows.Cast<GridViewRow>().Select(s => (s.Cells[11].Text.ToString())).Distinct().ToList();
    foreach (string idPagador in lstPagador)
    {
    	//Aqui tu vai obter separadamente os dados por pagador, podendo executar a chamada do ws
    	var travelers = gvExcelFile.Rows.Cast<GridViewRow>().Where(i => (i.Cells[11].Text.ToString()) == idPagador)
    	.Select(s => new Agencia.Emissao.TravelerRequest()
    		{
    			CompanyAmount = 0,
    			DateOfBirth = Convert.ToDateTime(s.Cells[7].Text.ToString().Trim()),
    			FirstName = Server.HtmlDecode(s.Cells[4].Text.ToString().Trim()),
    			LastName = Server.HtmlDecode(sCells[5].Text.ToString().Trim()),
    			IdentityDocuments = identity.ToArray(),
    			PPERelationshipCode = ""                                         
    		}
    	).ToList();
    }
    Talvez ainda tenha que adaptar algo, mas a ideia é você pegar o resultado do grid e já obter uma lista da tua classe.





    Maravilha Rodrigo, ajudou 100%.
    Muito obrigado.

    Só estou vendo referenta esta linha:

    IdentityDocuments = identity.ToArray(),
    var identity = new List<Agencia.Emissao.IdentityDocument>()
                            { new Agencia.Emissao.IdentityDocument()
                                {
                                    Code = "CPF",
                                    Number = Server.HtmlDecode(gvExcelFile.Rows[contador].Cells[6].Text.ToString().Trim())
                                }};
    ele recebe um array de argumentos, sendo assim ele já chega nesse campo populado, porém eu ainda estou populando os campo, há alguma maneira de preencher diretamente ?

    Eu tentei mas deu um erro de atribuição de objetos



    sexta-feira, 4 de setembro de 2015 16:04
  • Acho que o código abaixo pode te ajudar:

    List<string> lstPagador = gvExcelFile.Rows.Cast<GridViewRow>().Select(s => (s.Cells[11].Text.ToString())).Distinct().ToList();
    foreach (string idPagador in lstPagador)
    {
    	//Aqui tu vai obter separadamente os dados por pagador, podendo executar a chamada do ws
    	var travelers = gvExcelFile.Rows.Cast<GridViewRow>().Where(i => (i.Cells[11].Text.ToString()) == idPagador)
    	.Select(s => new Agencia.Emissao.TravelerRequest()
    		{
    			CompanyAmount = 0,
    			DateOfBirth = Convert.ToDateTime(s.Cells[7].Text.ToString().Trim()),
    			FirstName = Server.HtmlDecode(s.Cells[4].Text.ToString().Trim()),
    			LastName = Server.HtmlDecode(sCells[5].Text.ToString().Trim()),
    			IdentityDocuments = identity.ToArray(),
    			PPERelationshipCode = ""                                         
    		}
    	).ToList();
    }
    Talvez ainda tenha que adaptar algo, mas a ideia é você pegar o resultado do grid e já obter uma lista da tua classe.





    Maravilha Rodrigo, ajudou 100%.
    Muito obrigado.

    Só estou vendo referenta esta linha:

    IdentityDocuments = identity.ToArray(),
    var identity = new List<Agencia.Emissao.IdentityDocument>()
                            { new Agencia.Emissao.IdentityDocument()
                                {
                                    Code = "CPF",
                                    Number = Server.HtmlDecode(gvExcelFile.Rows[contador].Cells[6].Text.ToString().Trim())
                                }};
    ele recebe um array de argumentos, sendo assim ele já chega nesse campo populado, porém eu ainda estou populando os campo, há alguma maneira de preencher diretamente ?
    

    Eu tentei mas deu um erro de atribuição de objetos



    Sobre o identity, eu não entendi exatamente o que você precisa. Cada instância de TravelerRequest recebe uma coleção (List<Agencia.Emissao.IdentityDocument>) contendo a identificação de todos os passageiros daquele pagador? É isto que você quer: obter todas as identificações dos passageiros antes e, depois atribuir ao campo IdentityDocuments? Se for isto, pode ser assim:

    List<string> lstPagador = gvExcelFile.Rows.Cast<GridViewRow>().Select(s => (s.Cells[11].Text.ToString())).Distinct().ToList();
    foreach (string idPagador in lstPagador)
    {
    	var identity = gvExcelFile.Rows.Cast<GridViewRow>().Where(i => (i.Cells[11].Text.ToString()) == idPagador)
    	.Select(s => new Agencia.Emissao.IdentityDocument()
    		{
    			Code = "CPF",
    			Number = Server.HtmlDecode(s.Cells[6].Text.ToString().Trim())
    		}
    	).ToList();
    	
    	//Aqui tu vai obter separadamente os dados por pagador, podendo executar a chamada do ws
    	var query = gvExcelFile.Rows.Cast<GridViewRow>().Where(i => (i.Cells[11].Text.ToString()) == idPagador)
    	.Select(s => new Agencia.Emissao.TravelerRequest()
    		{
    			CompanyAmount = 0,
    			DateOfBirth = Convert.ToDateTime(s.Cells[7].Text.ToString().Trim()),
    			FirstName = Server.HtmlDecode(s.Cells[4].Text.ToString().Trim()),
    			LastName = Server.HtmlDecode(sCells[5].Text.ToString().Trim()),
    			IdentityDocuments = identity.ToArray(),
    			PPERelationshipCode = "",                                         
    		}
    	).ToList();
    }

    Se não tem nada a ver com isto, explica um pouco mais o que você precisa.

    Bom trabalho!

    sexta-feira, 4 de setembro de 2015 17:46