Usuário com melhor resposta
realizar select dos dados de uma GridView

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 ?
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
- Marcado como Resposta processo ao executar comando no servidor sexta-feira, 4 de setembro de 2015 14:46
-
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.
- Marcado como Resposta processo ao executar comando no servidor 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.
- Editado Rodrigo CdS sexta-feira, 4 de setembro de 2015 15:19
- Marcado como Resposta processo ao executar comando no servidor sexta-feira, 4 de setembro de 2015 16:00
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!
-
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
- Marcado como Resposta processo ao executar comando no servidor sexta-feira, 4 de setembro de 2015 14:46
-
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.
-
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.
- Marcado como Resposta processo ao executar comando no servidor sexta-feira, 4 de setembro de 2015 14:46
-
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 listaTravelers = 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 ? -
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.
- Editado Rodrigo CdS sexta-feira, 4 de setembro de 2015 15:19
- Marcado como Resposta processo ao executar comando no servidor sexta-feira, 4 de setembro de 2015 16:00
-
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
- Editado processo ao executar comando no servidor sexta-feira, 4 de setembro de 2015 16:06 texto alterado
-
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!