我看到两种不同的解决方案:
1) 手动实现数据管理:
a) 按伪分组列对数据进行排序;b) 浏览排序后的数据列表,手动计算汇总值,最后显示该值;
2)在页面上创建一个新的网格,将其与数据绑定,按所需列分组,获取汇总值并最终处理它。
我没有检查第二种方法,但我看不出为什么这种方法不起作用的原因。
更新
如果您使用自定义摘要,则只能设置摘要值。这可以在 CustomSummaryCalculate 事件处理程序中完成。同样要获取汇总值,您可以使用以下代码:
double total = 0;
for(int i = 0; i < ASPxGridView1.VisibleRowCount; i ++) {
total += Convert.ToDouble(ASPxGridView1.GetGroupSummaryValue(i, someSummaryItem));
}
你应该实现这样的东西。
更新 2
好的,我想我已经找到了解决这个问题的最有效的方法。让我解释。首先,有必要使用自定义摘要,如自定义摘要主题中所述。使用 CustomSummaryCalculate 事件处理程序,有必要将数据收集到 Dictionary 对象,其键包含 Customer_No 字段值,value - 此客户的价格值列表。最后,有必要计算得出的摘要。下面是完整的代码,包括 ASPx 和 C#。我希望,它会对你有所帮助。
<dx:ASPxGridView ID="ASPxGridView1" runat="server" OnCustomSummaryCalculate="ASPxGridView1_CustomSummaryCalculate">
<TotalSummary>
<dx:ASPxSummaryItem FieldName="Price" SummaryType="Custom" ShowInColumn="Price" />
</TotalSummary>
<Settings ShowFooter="True" />
</dx:ASPxGridView>
...
using System;
using System.Collections.Generic;
using System.Data;
using System.Collections;
protected void Page_Init(object sender, EventArgs e) {
ASPxGridView1.DataSource = GetDataSource();
ASPxGridView1.DataBind();
}
private object CreateDataSource() {
DataTable table = new DataTable();
table.Columns.Add("Customer_No", typeof(int));
table.Columns.Add("Price", typeof(int));
table.Rows.Add(new object[] {123, 50 });
table.Rows.Add(new object[] {123, 100 });
table.Rows.Add(new object[] {123, 60 });
table.Rows.Add(new object[] {124, 60 });
table.Rows.Add(new object[] {125, 20 });
table.Rows.Add(new object[] {125, 40 });
return table;
}
private object GetDataSource() {
if(Session["data"] == null)
Session["data"] = CreateDataSource();
return Session["data"];
}
Dictionary<int, List<int>> dict;
protected void ASPxGridView1_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs e) {
if(e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Start)
dict = new Dictionary<int, List<int>>();
if(e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Calculate) {
int customer_No = Convert.ToInt32(e.GetValue("Customer_No"));
List<int> list;
if(!dict.TryGetValue(customer_No, out list)) {
list = new List<int>();
dict.Add(customer_No, list);
}
list.Add(Convert.ToInt32(e.GetValue("Price")));
}
if(e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Finalize) {
e.TotalValue = CalculateTotal();
}
}
private object CalculateTotal() {
IEnumerator en = dict.GetEnumerator();
en.Reset();
float result = 0;
while(en.MoveNext()) {
KeyValuePair<int, List<int>> current = ((KeyValuePair<int, List<int>>)en.Current);
int sum = 0;
for(int i = 0; i < current.Value.Count; i++)
sum += current.Value[i];
result += sum / current.Value.Count;
}
return result;
}