FlexGrid
カスタムフッター
このサンプルでは、FlexGrid を拡張して以下の 2 つのタイプのフッター要素を提供する方法を示します。
機能
サンプル
説明
このサンプルでは、FlexGrid を拡張して以下の 2 つのタイプのフッター要素を提供する方法を示します。
- 列フッター行:グリッドデータの下に、小計などのサマリー情報を含む スクロール不可能な行を表示したい場合があります。 それには、ShowColumnFooters(bool value = true, string rowHeaderText = null) メソッドを使用します。 Aggregate プロパティが設定されたすべての列に対して、 自動的に値が提供されます。これが、このサンプルが実行していることです。
- グループフッター行:グループ化を有効にすると、FlexGrid が各グループの上にグループ行を追加します。 このサンプルでは、各グループの下にもカスタムグループ行を追加する方法を示します。
ソース
CustomFootersController.cs
using C1.Web.Mvc;
using C1.Web.Mvc.Serialization;
using Microsoft.AspNetCore.Mvc;
using MvcExplorer.Models;
namespace MvcExplorer.Controllers
{
public partial class FlexGridController : Controller
{
public ActionResult CustomFooters()
{
return View();
}
public ActionResult CustomFooters_Bind([C1JsonRequest] CollectionViewRequest<Sale> requestData)
{
return this.C1Json(CollectionViewHelper.Read(requestData, Sale.GetData(500)));
}
}
}
CustomFooters.cshtml
@model IEnumerable<Sale>
@section Scripts{
<script>
// class used to identify group footer rows
var ROW_FOOTER_CLASS = 'wj-groupfooter';
function grouping(groupBy) {
var flex = wijmo.Control.getControl('#grid'), data = flex.collectionView;
flex.beginUpdate();
data.groupDescriptions.clear();
var groups = groupBy ? groupBy.split(',') : [];
for (var i = 0; i < groups.length; i++) {
data.groupDescriptions.push(new wijmo.collections.PropertyGroupDescription(groups[i]));
}
flex.endUpdate();
}
function onLoadedRows() {
var flex = wijmo.Control.getControl('#grid');
if (flex.collectionView.groupDescriptions.length) {
addGroupFooters();
}
}
// add group footers
function addGroupFooters() {
var flex = wijmo.Control.getControl('#grid');
flex.beginUpdate();
for (var r = 0; r < flex.rows.length; r++) {
var row = flex.rows[r];
if (row instanceof wijmo.grid.GroupRow && row.cssClass != ROW_FOOTER_CLASS) {
// create footer row to match this group row
var newRow = new wijmo.grid.GroupRow();
newRow.level = row.level;
newRow.cssClass = ROW_FOOTER_CLASS;
// add footer row to the grid
var index = findFooterIndex(r);
flex.rows.insert(index, newRow);
// add some content to footer row
var group = row.dataItem;
flex.setCellData(index, 0, 'f(' + group.name + ')', false);
}
}
flex.endUpdate();
}
// find the index where the group footer should be inserted
function findFooterIndex(r) {
var flex = wijmo.Control.getControl('#grid');
var level = flex.rows[r].level;
for (var i = r + 1; i < flex.rows.length; i++) {
var row = flex.rows[i];
if (row instanceof wijmo.grid.GroupRow) {
// if this is *not* a footer and the level is <=, insert here
if (row.cssClass != ROW_FOOTER_CLASS && row.level <= level) {
return i;
}
// if this *is* a footer and the level is <, insert here
if (row.cssClass == ROW_FOOTER_CLASS && row.level < level) {
return i;
}
}
}
// insert at the bottom
return flex.rows.length;
}
</script>
}
<style>
.wj-control .wj-btn-group {
border: 1px solid rgba(0, 0, 0, 0.2);
}
.wj-control .wj-btn-group * {
color: black !important;
}
.wj-control .wj-btn-group > *:not(:first-child) {
border-left: 1px solid rgba(0, 0, 0, 0.2);
}
.wj-control .wj-btn-group > .wj-btn.wj-btn-default:hover,
.wj-control .wj-btn-group > .wj-btn.wj-btn-default:focus {
background: #eee !important;
}
</style>
<label>@Html.Raw(FlexGridRes.CustomFooters_Text1)</label>
<div class="wj-btn-group">
<button type="button" class="wj-btn wj-btn-default" onclick="grouping('')">@Html.Raw(FlexGridRes.CustomFooters_None)</button>
<button type="button" class="wj-btn wj-btn-default" onclick="grouping('Country')">@Html.Raw(FlexGridRes.CustomFooters_Country)</button>
<button type="button" class="wj-btn wj-btn-default" onclick="grouping('Product')">@Html.Raw(FlexGridRes.CustomFooters_Product)</button>
<button type="button" class="wj-btn wj-btn-default" onclick="grouping('Product,Color')">@Html.Raw(FlexGridRes.CustomFooters_ProductAndColor)</button>
</div>
<label>@Html.Raw(FlexGridRes.CustomFooters_Text2)</label>
<div class="multi-grid">
<c1-flex-grid id="grid" is-read-only="true" auto-generate-columns="false"
show-groups="true" class="grid" loaded-rows="onLoadedRows"
show-column-footers="true">
<c1-items-source disable-server-read="true" read-action-url="@Url.Action("CustomFooters_Bind")"></c1-items-source>
<c1-flex-grid-column binding="ID" width="70"></c1-flex-grid-column>
<c1-flex-grid-column binding="Start"></c1-flex-grid-column>
<c1-flex-grid-column binding="End"></c1-flex-grid-column>
<c1-flex-grid-column binding="Country"></c1-flex-grid-column>
<c1-flex-grid-column binding="Product"></c1-flex-grid-column>
<c1-flex-grid-column binding="Color"></c1-flex-grid-column>
<c1-flex-grid-column binding="Amount2" format="c" aggregate="Sum"></c1-flex-grid-column>
<c1-flex-grid-column binding="Discount" width="100" format="p0" aggregate="Avg"></c1-flex-grid-column>
<c1-flex-grid-column binding="Active" width="80"></c1-flex-grid-column>
</c1-flex-grid>
</div>
@section Summary{
@Html.Raw(FlexGridRes.CustomFooters_Text0)
}
@section Description{
<p>@Html.Raw(FlexGridRes.CustomFooters_Text0)</p>
<ol>
<li>@Html.Raw(FlexGridRes.CustomFooters_Li1)</li>
<li>@Html.Raw(FlexGridRes.CustomFooters_Li2)</li>
</ol>
}
マニュアル