如何实现 OnCustomAggregate (Telerik:RadGrid)
How to implement OnCustomAggregate (Telerik:RadGrid)
我在 ASP 页面中有一个 RadGrid。网格按包含组织名称的列分组。还有一个包含价格的列,我想在组页脚(以及网格页脚)中汇总它们。到目前为止,一切都很好。我可以将 Aggregate="Custom"
添加到我要求和的列中。
还有一列包含复选框。我想排除选中复选框的行。因此,我将 Aggregate="Custom"
添加到该列,并在 RadGrid 上添加 OnCustomAggregate="rg_CustomAggregate"
。现在我需要实施此方法 rg_CustomAggregate 但我正在努力解决如何实际浏览行以便将行中的价格与未选中的复选框相加的问题。
到目前为止,该方法的基础如下所示:
protected void rg_CustomAggregate(object sender, GridCustomAggregateEventArgs e)
{
int sum = 0;
if (e.Item is GridGroupFooterItem)
{
// TODO: The magic.
e.Result = sum;
}
if (e.Item is GridFooterItem)
{
// TODO: Som other magic.
e.Result = sum;
}
}
很高兴接受有关如何实施魔法的任何提示。我很难在网上找到这方面的例子。
下载本页提到的 zip 文件 (customaggreagtes.zip) 后 https://www.telerik.com/forums/real-customaggregate-group-footer-example-needed 我想出了以下解决方案:
protected void rg_CustomAggregate(object sender, GridCustomAggregateEventArgs e)
{
if (e.Item is GridGroupFooterItem)
{
GridGroupFooterItem gridFooterItem = e.Item as GridGroupFooterItem;
GridItem[] groupHeaders = rg.MasterTableView.GetItems(GridItemType.GroupHeader);
foreach (GridGroupHeaderItem groupHeader in groupHeaders)
{
if (groupHeader.GroupIndex == gridFooterItem.GroupIndex)
{
decimal groupSum = 0;
foreach (GridItem childItem in groupHeader.GetChildItems())
{
FunctionSummaryDTO functionSummary = (FunctionSummaryDTO)childItem.DataItem;
if (functionSummary.UpfrontPayment == false)
{
groupSum += functionSummary.InvoiceAmount;
}
}
e.Result = groupSum;
}
}
}
if (e.Item is GridFooterItem)
{
decimal totalSum = 0;
GridItem[] groupFooters = rg.MasterTableView.GetItems(GridItemType.GroupFooter);
foreach (GridGroupFooterItem groupFooter in groupFooters)
{
decimal parseBuffer = 0;
decimal.TryParse(groupFooter["colInvoiceAmount"].Text, out parseBuffer);
totalSum += parseBuffer;
}
e.Result = totalSum;
}
}
这可能不是最优雅的解决方案,但它可以解决问题。它使机器人脱离了上下文,所以我将尝试解释一些细节,以使其更有意义。
FunctionSummaryDTO
是只包含属性的 class。它包含网格中一行的数据。
functionSummary.UpfrontPayment
是复选框的数据。
functionSummary.InvoiceAmount
是应该相加的价格
colInvoiceAmount
是包含要求和的价格的列的唯一名称。
我在 ASP 页面中有一个 RadGrid。网格按包含组织名称的列分组。还有一个包含价格的列,我想在组页脚(以及网格页脚)中汇总它们。到目前为止,一切都很好。我可以将 Aggregate="Custom"
添加到我要求和的列中。
还有一列包含复选框。我想排除选中复选框的行。因此,我将 Aggregate="Custom"
添加到该列,并在 RadGrid 上添加 OnCustomAggregate="rg_CustomAggregate"
。现在我需要实施此方法 rg_CustomAggregate 但我正在努力解决如何实际浏览行以便将行中的价格与未选中的复选框相加的问题。
到目前为止,该方法的基础如下所示:
protected void rg_CustomAggregate(object sender, GridCustomAggregateEventArgs e)
{
int sum = 0;
if (e.Item is GridGroupFooterItem)
{
// TODO: The magic.
e.Result = sum;
}
if (e.Item is GridFooterItem)
{
// TODO: Som other magic.
e.Result = sum;
}
}
很高兴接受有关如何实施魔法的任何提示。我很难在网上找到这方面的例子。
下载本页提到的 zip 文件 (customaggreagtes.zip) 后 https://www.telerik.com/forums/real-customaggregate-group-footer-example-needed 我想出了以下解决方案:
protected void rg_CustomAggregate(object sender, GridCustomAggregateEventArgs e)
{
if (e.Item is GridGroupFooterItem)
{
GridGroupFooterItem gridFooterItem = e.Item as GridGroupFooterItem;
GridItem[] groupHeaders = rg.MasterTableView.GetItems(GridItemType.GroupHeader);
foreach (GridGroupHeaderItem groupHeader in groupHeaders)
{
if (groupHeader.GroupIndex == gridFooterItem.GroupIndex)
{
decimal groupSum = 0;
foreach (GridItem childItem in groupHeader.GetChildItems())
{
FunctionSummaryDTO functionSummary = (FunctionSummaryDTO)childItem.DataItem;
if (functionSummary.UpfrontPayment == false)
{
groupSum += functionSummary.InvoiceAmount;
}
}
e.Result = groupSum;
}
}
}
if (e.Item is GridFooterItem)
{
decimal totalSum = 0;
GridItem[] groupFooters = rg.MasterTableView.GetItems(GridItemType.GroupFooter);
foreach (GridGroupFooterItem groupFooter in groupFooters)
{
decimal parseBuffer = 0;
decimal.TryParse(groupFooter["colInvoiceAmount"].Text, out parseBuffer);
totalSum += parseBuffer;
}
e.Result = totalSum;
}
}
这可能不是最优雅的解决方案,但它可以解决问题。它使机器人脱离了上下文,所以我将尝试解释一些细节,以使其更有意义。
FunctionSummaryDTO
是只包含属性的 class。它包含网格中一行的数据。functionSummary.UpfrontPayment
是复选框的数据。functionSummary.InvoiceAmount
是应该相加的价格colInvoiceAmount
是包含要求和的价格的列的唯一名称。