FineUIPro/Mvc/Core的下個版本(v7.0.0),我們會為表格新增行分組功能,這也是很多用戶期待的功能。
上一篇文章,我們介紹了行分組的基本特性,今天就來講解一下表格行分組的合計。
基本用法
開啟行分組合計,我們需要如下兩個步驟:
- 為表格增加 RowGroupSummary="true" 屬性
- 為需要開啟行分組合計的行增加 RowGroupSummaryText、RowGroupSummaryType 或者RowGroupSummaryRendererFunction屬性
下面來看一個示例的頁面效果:

表格標簽定義:
<f:Grid ID="Grid1" IsFluid="true" CssClass="blockpanel" Height="500px" ShowBorder="true" ShowHeader="true" Title="表格" runat="server" EnableCollapse="false" DataKeyNames="Id,Name" DataIDField="Id" DataTextField="Name" EnableRowGroup="true" DataRowGroupField="EntranceYear" RowGroupSummary="true"> <Columns> ...... <f:RenderField ColumnID="Major" DataField="Major" RendererFunction="renderMajor" ExpandUnusedSpace="true" MinWidth="150px" HeaderText="所學專業" RowGroupSummaryText="平均(分組):"> </f:RenderField> <f:RenderField Width="100px" DataField="ChineseScore" FieldType="Int" ColumnID="ChineseScore" HeaderText="語文成績" RowGroupSummaryType="Avg" /> <f:RenderField Width="100px" DataField="MathScore" FieldType="Int" ColumnID="MathScore" HeaderText="數學成績" RowGroupSummaryType="Avg" /> </Columns> </f:Grid>
RowGroupSummaryType對應幾個預定義的合計方式:
public enum SummaryType
{
/// <summary>
/// 未定義
/// </summary>
Undefined,
/// <summary>
/// 總和
/// </summary>
Sum,
/// <summary>
/// 最小值
/// </summary>
Min,
/// <summary>
/// 最大值
/// </summary>
Max,
/// <summary>
/// 個數
/// </summary>
Count,
/// <summary>
/// 平均
/// </summary>
Avg
}
當然,我們也可以通過 RowGroupSummaryRendererFunction 屬性,來自定義合計。
多行分組合計
要開啟多行分組合計,我們需要設置表格的RowGroupSummaryRowCount。
此時表格列就不能用 RowGroupSummaryText、RowGroupSummaryType兩個屬性了,因為它們無從告知每一行合計的結果,只能使用自定義合計的方式。
來看個示例效果(這個示例不僅啟用多行分組合計,而且啟用了表格多行合計):

表格的標簽定義:
<f:Grid ID="Grid1" IsFluid="true" CssClass="blockpanel" Height="500px" ShowBorder="true" ShowHeader="true" Title="表格" runat="server" EnableCollapse="false" DataKeyNames="Id,Name" EnableSummary="true" SummaryPosition="Bottom" SummaryRowCount="3" DataIDField="Id" DataTextField="Name" EnableRowGroup="true" DataRowGroupField="EntranceYear" RowGroupSummary="true" RowGroupSummaryRowCount="3"> <Columns> ...... <f:RenderField ColumnID="Major" DataField="Major" RendererFunction="renderMajor" ExpandUnusedSpace="true" MinWidth="150px" HeaderText="所學專業" SummaryRendererFunction="majorSummaryRenderer" RowGroupSummaryRendererFunction="majorRowGroupSummaryRenderer"> </f:RenderField> <f:RenderField Width="100px" DataField="ChineseScore" FieldType="Int" ColumnID="ChineseScore" HeaderText="語文成績" SummaryRendererFunction="chineseScoreSummaryRenderer" RowGroupSummaryRendererFunction="chineseScoreRowGroupSummaryRenderer" /> <f:RenderField Width="100px" DataField="MathScore" FieldType="Int" ColumnID="MathScore" HeaderText="數學成績" SummaryRendererFunction="mathScoreSummaryRenderer" RowGroupSummaryRendererFunction="mathScoreRowGroupSummaryRenderer" /> </Columns> </f:Grid>
標簽有點復雜,是因為同時開啟了行分組和表格的多行合計,可以從命名上區分:
表格的多行合計:
- EnableSummary="true"
- SummaryPosition="Bottom"
- SummaryRowCount="3"
行分組的多行合計:
- EnableRowGroup="true"
- DataRowGroupField="EntranceYear"
- RowGroupSummary="true"
- RowGroupSummaryRowCount="3"
同理,表格列的合計渲染函數命名也遵循類似的原則:
表格列的合計渲染函數:
- SummaryRendererFunction="majorSummaryRenderer"
行分組的合計渲染函數:
- RowGroupSummaryRendererFunction="majorRowGroupSummaryRenderer"
下面來看下合計渲染函數的客戶端實現:
表格列:
function majorSummaryRenderer(summaryRowIndex) {
if (summaryRowIndex == 0) {
return "最小值:";
} else if (summaryRowIndex == 1) {
return "最大值:";
} else if (summaryRowIndex == 2) {
return "平均值:";
}
}
function chineseScoreSummaryRenderer(summaryRowIndex) {
var grid1 = this, result;
if (summaryRowIndex == 0) {
result = grid1.calcSummaryValue('ChineseScore', 'min');
} else if (summaryRowIndex == 1) {
result = grid1.calcSummaryValue('ChineseScore', 'max');
} else if (summaryRowIndex == 2) {
result = grid1.calcSummaryValue('ChineseScore', 'avg');
}
return result;
}
function mathScoreSummaryRenderer(summaryRowIndex) {
var grid1 = this, result;
if (summaryRowIndex == 0) {
result = grid1.calcSummaryValue('MathScore', 'min');
} else if (summaryRowIndex == 1) {
result = grid1.calcSummaryValue('MathScore', 'max');
} else if (summaryRowIndex == 2) {
result = grid1.calcSummaryValue('MathScore', 'avg');
}
return result;
}
行分組:
function majorRowGroupSummaryRenderer(summaryRowIndex) {
if (summaryRowIndex == 0) {
return "最小值:";
} else if (summaryRowIndex == 1) {
return "最大值:";
} else if (summaryRowIndex == 2) {
return "平均值:";
}
}
function chineseScoreRowGroupSummaryRenderer(summaryRowIndex, rowGroupData) {
var grid1 = this, result;
if (summaryRowIndex == 0) {
result = grid1.calcSummaryValue('ChineseScore', 'min', rowGroupData);
} else if (summaryRowIndex == 1) {
result = grid1.calcSummaryValue('ChineseScore', 'max', rowGroupData);
} else if (summaryRowIndex == 2) {
result = grid1.calcSummaryValue('ChineseScore', 'avg', rowGroupData);
}
return result;
}
function mathScoreRowGroupSummaryRenderer(summaryRowIndex, rowGroupData) {
var grid1 = this, result;
if (summaryRowIndex == 0) {
result = grid1.calcSummaryValue('MathScore', 'min', rowGroupData);
} else if (summaryRowIndex == 1) {
result = grid1.calcSummaryValue('MathScore', 'max', rowGroupData);
} else if (summaryRowIndex == 2) {
result = grid1.calcSummaryValue('MathScore', 'avg', rowGroupData);
}
return result;
}
其中 calcSummaryValue 是由FineUI提供的一個計算合計的內置函數。當然,復雜的邏輯你也可以自己弄,合計行的數據你都能拿到。
行分組與分頁排序
由於行分組是在客戶端實現的,所以我們可以很容易的加上數據庫分頁和排序。
注意:啟用行分組時,不能使用內存分頁。
下面看下示例效果(由於代碼只是簡單的組合兩者,就不在此贅述了):

三石出品,必屬精品
