Totalizar registros de um ObjectDataSource
Olá pessoal,
Tenho uma gridview paginada, utilizando objectDataSource.
Como posso mostrar no rodapé a quantidade total de registros, não o total por página, mais sim a quantidade total geral de registros, considerando todas as páginas?
Obrigada!
Respostas
Oi,
Troque a linha do cálculo :
total = DirectCast(e.Row.DataItem, DataRowView).DataView.Table.Rows.Count
[]'s
Dennes
http://twitter.com/Dennes* Treinamento C# e Framework .NET c/OO dia 07/11 - Apenas 12 R$ 42,53 Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp
* Treinamento de ASP.NET 3.5 no RJ dia 16/11 - Apenas 12x R$ 60,48 - Inscreva-se em http://www.bufaloinfo.com.br/descontoaspnetantecipado.asp
Tel : (11) 3170-3056 (21)9240-5134 E-Mail: contato arroba bufaloinfo.com.br
http://www.bufaloinfo.com.br
Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp- Marcado como Resposta_Vivi_ segunda-feira, 9 de novembro de 2009 16:14
Todas as Respostas
- Vc pode usar o
SelectCountMethod para fazer o calculo para vc e vc salva o valor no footer da grid
da uma olhada
http://fredrik.nsquared2.com/viewpost.aspx?PostID=229- EditadoSeilor Bonancio Junior terça-feira, 27 de outubro de 2009 19:19ok
- Vivi, veja se esse tutorial resolve seu problema
http://www.asp.net/learn/data-access/tutorial-15-vb.aspx
Junior Oi,
Crie a seguinte variável :
decimal total;
Mude a propriedade showfooter da gridview para true
Insira no rodapé de uma das colunas um label chamado lbltotal
Supondo que seu objectdatasource devolve uma datatable, dentro do evento rowdatabound da gridview, programe o seguinte (corrija as maiusculas e minusculas) :
if (e.row.rowtype==datarow)
{
if (total==0)
{
total= ((data.datarowview)e.row.dataitem).dataview.table.select("sum(valorasersomado)"); // linha x
}
}
else if (e.row.rowtype==footer)
{
label lbl;
lbl=(label)e.row.findcontrol("lbltotal");
lbl.text=string.format("{0:C}",total);
}
Caso seu objectDataSource não esteja devolvendo datatable, troque a "linha x" por uma totalização dos objetos que ele devolve. Sugiro usar linq nesse caso, mas não posso ajudar mais pois não sei que objetos são.
[]'s
Dennes
http://twitter.com/Dennes* Treinamento C# e Framework .NET c/OO dia 31/10 - Apenas 12 R$ 42,53 Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp
* Treinamento de ASP.NET 3.5 no RJ dia 16/11 - Apenas 12x R$ 60,48 - Inscreva-se em http://www.bufaloinfo.com.br/descontoaspnetantecipado.asp
Tel : (11) 3170-3056 (21)9240-5134 E-Mail: contato arroba bufaloinfo.com.br
http://www.bufaloinfo.com.br
Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp- Olá pessoal,
Resolvi assim:
Public Function TotalRegistros() As Integer Dim dt As New DataTable() dt = clMembership.ListarColaboradores(Convert.ToBoolean(dropAtivo.SelectedValue()), txtBusca.Text.Trim) dt.Dispose() Return dt.Rows.Count() End Function
Depois, num label coloquei:
lblResposta.Text = "Foram encontrados " + TotalRegistros().ToString() + " registros"
Obrigada a todos! Oi, Vivi,
A diferença da forma como você fez e a forma que indiquei para você é que da forma como você fez você chamou novamente o método que lista seus dados. Os problemas disso são :
1) Você duplicou o processamento de acesso aos dados, duplicando o consumo de performance da página
2) Você colocou em 2 locais da página a mesma chamada. Isso é ruim para manutenção, lembrar daqui a 1 ano que isso está em dois lugares diferentes...
Da forma que indiquei você chegará no mesmo resultado e não terá esses problemas pois o código utiliza a datatable já retornada pelo objectdatasource.
[]'s
Dennes
http://twitter.com/Dennes* Treinamento C# e Framework .NET c/OO dia 31/10 - Apenas 12 R$ 42,53 Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp
* Treinamento de ASP.NET 3.5 no RJ dia 16/11 - Apenas 12x R$ 60,48 - Inscreva-se em http://www.bufaloinfo.com.br/descontoaspnetantecipado.asp
Tel : (11) 3170-3056 (21)9240-5134 E-Mail: contato arroba bufaloinfo.com.br
http://www.bufaloinfo.com.br
Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp- Oi Dennes,
Da forma que vc falou seria pra totalizar os valores de uma coluna do grid, não é?
O que eu preciso é totalizar os registros do resultado da busca. Estou exibindo paginado, mas preciso exibir o total de registros retornados pela busca, por isso fiz dessa forma...
Obrigada! - Oi,
Para pegar a quantidade total de registros que foram retornados pelo ObjectDataSource eu costumo fazer assim:
Utilize o evento "Selected" do ObjectDataSource.
protected void odsIdSeuObjectDataSource_Selected(object sender, ObjectDataSourceStatusEventArgs e) { int qtdRegistros = 0; qtdRegistros = ((AquiVemOTipoDoObjetoQueSeuObjectDataSourceRetorna)e.ReturnValue).Count; }
- Oi Kaue,
Converti seu código para vb.net, ficou assim:
Protected Sub ObjectDataSource1_Selected(ByVal sender As Object, ByVal e As ObjectDataSourceStatusEventArgs) Dim qtdRegistros As Integer = 0 qtdRegistros = DirectCast(e.ReturnValue, DataTable).Count End Sub
Mas dá o seguinte erro:
'Count' is not a member of 'System.Data.DataTable'.
Obrigada! - Tente:
qtdRegistros = DirectCast(e.ReturnValue, DataTable).Rows.Count Oi, Vivi,
Não, não seria para totalizar uma coluna da grid.
Da forma como demonstrei, a grid é utilizada para buscar a origem de dados sem que seja necessário refazer a query e totalizar a origem de dados sem fazer a query novamente.
Veja o mesmo código em VB:
if (e.row.rowtype=datarow) then
if total=0 then
total=directcast(e.row.dataitem,datarowview).dataview.table.select("sum(valorasersomado)")
endif
elseif e.row.rowtype=footer then
dim lbl as label
lbl=e.row.findcontrol("lbltotal")
lbl.text=string.format("{0:C}",total)
endif
[]'s
Dennes
http://twitter.com/Dennes* Treinamento C# e Framework .NET c/OO dia 31/10 - Apenas 12 R$ 42,53 Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp
* Treinamento de ASP.NET 3.5 no RJ dia 16/11 - Apenas 12x R$ 60,48 - Inscreva-se em http://www.bufaloinfo.com.br/descontoaspnetantecipado.asp
Tel : (11) 3170-3056 (21)9240-5134 E-Mail: contato arroba bufaloinfo.com.br
http://www.bufaloinfo.com.br
Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp- Oi Dennes,
Fiz assim:
Mas acho que não estou sabendo o que colocar em "sum(valorasersomado)". Usei a coluna IdColaborador mas dá o seguinte erro: "Expressão de filtro 'sum(IdColaborador)' não avalia um termo booleano. "Public Sub SomarRegistros(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles GridView.RowDataBound Dim total As Integer If (e.Row.RowType = DataControlRowType.DataRow) Then If total = 0 Then total = Convert.ToInt32(DirectCast(e.Row.DataItem, DataRowView).DataView.Table.Select("sum(IdColaborador)")) End If ElseIf e.Row.RowType = DataControlRowType.Footer Then Dim lbl As Label lbl = e.Row.FindControl("lblTotal") lbl.Text = String.Format("{0:C}", total) End If End Sub
A coluna IdColaborador é autonumérica. Não quero somar os valores desta coluna, mas somar a qtd total de registros retornados pelo DataTable.
Vc sabe como posso resolver?
Obrigada! Oi Dennes,
Fiz assim:
Mas acho que não estou sabendo o que colocar em "sum(valorasersomado)". Usei a coluna IdColaborador mas dá o seguinte erro: "Expressão de filtro 'sum(IdColaborador)' não avalia um termo booleano. "Public Sub SomarRegistros(ByVal sender As Object , ByVal e As GridViewRowEventArgs) Handles GridView.RowDataBound Dim total As Integer If (e.Row.RowType = DataControlRowType.DataRow) Then If total = 0 Then total = Convert.ToInt32(DirectCast (e.Row.DataItem, DataRowView).DataView.Table.Select ("sum(IdColaborador)" )) End If ElseIf e.Row.RowType = DataControlRowType.Footer Then Dim lbl As Label lbl = e.Row.FindControl("lblTotal" ) lbl.Text = String .Format("{0:C}" , total) End If End Sub
A coluna IdColaborador é autonumérica. Não quero somar os valores desta coluna, mas somar a qtd total de registros retornados pelo DataTable.
Vc sabe como posso resolver?
Obrigada!
Na realidade não precisa somar o teu ID, e sim contar quantos registros tu teria. Ao contrário de jogar pro total a soma dos IDs tu apenas incrementa a variável total.
PS.: Claro que nesse caso a variável total teria que ser declarada na tua classe e não dentro da tua função.
Abraços,
Rafael CruzOi,
Troque a linha do cálculo :
total = DirectCast(e.Row.DataItem, DataRowView).DataView.Table.Rows.Count
[]'s
Dennes
http://twitter.com/Dennes* Treinamento C# e Framework .NET c/OO dia 07/11 - Apenas 12 R$ 42,53 Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp
* Treinamento de ASP.NET 3.5 no RJ dia 16/11 - Apenas 12x R$ 60,48 - Inscreva-se em http://www.bufaloinfo.com.br/descontoaspnetantecipado.asp
Tel : (11) 3170-3056 (21)9240-5134 E-Mail: contato arroba bufaloinfo.com.br
http://www.bufaloinfo.com.br
Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp- Marcado como Resposta_Vivi_ segunda-feira, 9 de novembro de 2009 16:14

