我有一个gridview摘要自定义计算器包含总计和每个项目一个。我需要根据您创建的组动态重新计算值,保持总量,这已经是正确的。
在DevExpress Docs中,我发现:https://www.devexpress.com/Support/Center/Question/Details/Q273195
在SO中,我发现:How to add a weighted average summary to a DevExpress XtraGrid?
我的方法:
private void gdvResultados_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs e)
{
#region Obtendo chave/valor para o cálculo
// Get the summary ID.
int summaryID = Convert.ToInt32((e.Item as GridSummaryItem).Tag);
GridView grid = sender as GridView;
// Chave para o agrupamento
var chaveDoAgrupamento = grid.GetGroupRowValue(e.RowHandle);
decimal vendas = 0M;
decimal meta = 0M;
decimal vlTotalVendido = 0M;
decimal vlTotalMeta = 0M;
// Initialization
if (e.SummaryProcess == CustomSummaryProcess.Start)
{
vendas = 0M;
meta = 0M;
vlTotalVendido = 0M;
vlTotalMeta = 0M;
}
#endregion
#region Calculando
// Calculation
if (e.SummaryProcess == CustomSummaryProcess.Calculate)
{
}
#endregion
#region Finalizando
if (!e.IsGroupSummary) return;
// Finalization
if (e.SummaryProcess == CustomSummaryProcess.Finalize)
{
if (Equals(((GridGroupSummaryItem)e.Item).Tag, 1))
{
e.TotalValue = grid.GetGroupRowValue(e.RowHandle, grid.GroupedColumns[e.GroupLevel]);
}
else
switch (summaryID)
{
case 0: // Total atingido da meta
foreach (var linha in lsBI)
{
vlTotalVendido += Convert.ToDecimal(linha.VlBrutoItem);
vlTotalMeta += Convert.ToDecimal(linha.ValorMGP);
}
e.TotalValue = vlTotalVendido / vlTotalMeta * 100;
break;
case 4: // meta do item
if (lsBI.Any(j => j.NmCaracteristicaPessoa == chaveDoAgrupamento.ToString()))
{
vendas = lsBI.Where(k => k.NmCaracteristicaPessoa == territorio.ToString()).Sum(v => Convert.ToDecimal(v.VlBrutoItem));
meta = lsBI.Where(t => t.NmCaracteristicaPessoa == territorio.ToString()).Sum(m => Convert.ToDecimal(m.ValorMGP));
if (vendas > 0 && meta > 0)
{
e.TotalValue = 0;
e.TotalValue = vendas / meta * 100;
}
}
else
if (lsBI.Any(j => j.NmGrupoProdutoMeta == chaveDoAgrupamento.ToString()))
{
vendas = lsBI.Where(k => k.NmGrupoProdutoMeta == chaveDoAgrupamento.ToString()).Sum(v => Convert.ToDecimal(v.VlBrutoItem));
meta = lsBI.Where(t => t.NmGrupoProdutoMeta == chaveDoAgrupamento.ToString()).Sum(m => Convert.ToDecimal(m.ValorMGP));
e.TotalValue = 0;
if (vendas > 0 && meta > 0)
{
e.TotalValue = vendas / meta * 100;
}
}
else
if (lsBI.Any(j => j.NmFamiliaProduto == chaveDoAgrupamento.ToString()))
{
vendas = lsBI.Where(k => k.NmFamiliaProduto == chaveDoAgrupamento.ToString()).Sum(v => Convert.ToDecimal(v.VlBrutoItem));
meta = lsBI.Where(t => t.NmFamiliaProduto == chaveDoAgrupamento.ToString()).Sum(m => Convert.ToDecimal(m.ValorMGP));
e.TotalValue = 0;
if (vendas > 0 && meta > 0)
{
e.TotalValue = vendas / meta * 100;
}
}
break;
}
}
#endregion
}