FlexGrid
ケースを表示
このビューは、FlexGrid for ASP.NET MVC の基本機能を示します。
機能
ソース
ShowCaseController.cs
using System.Collections;
using System.Globalization;
using System.Linq;
using System.Web.Mvc;
using C1.Web.Mvc;
using MvcExplorer.Models;
using System.Collections.Generic;
using System;
using C1.Web.Mvc.Serialization;
namespace MvcExplorer.Controllers
{
public partial class FlexGridController : Controller
{
private static List<SaleShowCase> model;
private readonly ControlOptions _showcaseOption = new ControlOptions
{
Options = new OptionDictionary
{
{"Data Size",new OptionItem{Values = new List<string> {"5 " + Resources.FlexGrid.ShowCase_Rows_Text0,
"50 " + Resources.FlexGrid.ShowCase_Rows_Text0, "500 " + Resources.FlexGrid.ShowCase_Rows_Text0,
"5000 " + Resources.FlexGrid.ShowCase_Rows_Text0, "50000 " + Resources.FlexGrid.ShowCase_Rows_Text0,
"100000 " + Resources.FlexGrid.ShowCase_Rows_Text0},CurrentValue = "500 " + Resources.FlexGrid.ShowCase_Rows_Text0}},
{"Lazy Render",new OptionItem{Values = new List<string> {"True", "False"},CurrentValue = "True"}}
}
};
public ActionResult ShowCase(FormCollection collection)
{
IValueProvider data = collection;
if (CallbackManager.CurrentIsCallback)
{
var request = CallbackManager.GetCurrentCallbackData<CollectionViewRequest<object>>();
if (request != null && request.ExtraRequestData != null)
{
var extraData = request.ExtraRequestData.Cast<DictionaryEntry>()
.ToDictionary(kvp => (string)kvp.Key, kvp => kvp.Value.ToString());
data = new DictionaryValueProvider<string>(extraData, CultureInfo.CurrentCulture);
}
}
_showcaseOption.LoadPostData(data);
model = Sale.GetData(getDataSize()).Select(x => SaleShowCase.FromSale(x)).ToList();
ViewBag.DemoOptions = _showcaseOption;
ViewBag.Countries = FullCountry.GetCountries();
ViewBag.Products = ProductObject.GetProductObjects();
ViewBag.Colors = ColorObject.GetColorObjects();
Theme.CurrentTheme = Themes.CleanLight;
return View(model);
}
public ActionResult GridShowCaseUpdate([C1JsonRequest]CollectionViewEditRequest<Sale> requestData)
{
return this.C1Json(CollectionViewHelper.Edit(requestData, sale =>
{
string error = string.Empty;
bool success = true;
try
{
var fSale = model.Find(item => item.ID == sale.ID);
fSale.Country = sale.Country;
fSale.Amount = sale.Amount;
fSale.Start = sale.Start;
fSale.End = sale.End;
fSale.Product = sale.Product;
fSale.Active = sale.Active;
fSale.Amount2 = sale.Amount2;
fSale.Color = sale.Color;
fSale.Discount = sale.Discount;
fSale.Rank = sale.Rank;
}
catch (Exception e)
{
error = e.Message;
success = false;
}
return new CollectionViewItemResult<Sale>
{
Error = error,
Success = success,
Data = sale
};
}, () => model));
}
private int getDataSize()
{
int dataSize = Int32.Parse(_showcaseOption.Options["Data Size"].CurrentValue.Split(' ')[0]);
return dataSize;
}
}
}
ShowCase.cshtml
@using C1.Web.Mvc.Grid
@model IEnumerable<SaleShowCase>
@{
ControlOptions optionsModel = ViewBag.DemoOptions;
ViewBag.DemoSettings = true;
List<FullCountry> countries = ViewBag.Countries;
List<ProductObject> products = ViewBag.Products;
List<ColorObject> colors = ViewBag.Colors;
}
@Scripts.Render("~/jquery")
@Scripts.Render("~/jqueryval")
<script src="~/Scripts/jszip.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/3.1.0/css/flag-icon.css" rel="stylesheet" />
<link href="~/Content/css/showcase.css" rel="stylesheet" />
<!--START: Cell templates-->
<script type="text/template" id="edtDate">
@(Html.C1().InputDate()
.Id("dateEditor")
.Format("MM/dd/yyyy")
.Min(Convert.ToDateTime("01/01/2000"))
.Max(Convert.ToDateTime("01/01/2030"))
.IsRequired(true)
.CssStyle("width", "100%")
.TemplateBind("Value", "Start")
.ToTemplate()
)
</script>
<script id="edtTime" type="text/template">
@(Html.C1().InputTime()
.Id("timeEditor")
.Format("hh:mm")
.Step(30)
.IsRequired(true)
.CssStyle("width", "100%")
.TemplateBind("Value", "End")
.ToTemplate()
)
</script>
<script id="countryShowing" type="text/template">
<span class='flag-icon flag-icon-{{CountryFlag}}'></span>
<span>{{Country}}</span>
</script>
<script type="text/template" id="colorShowing">
<span class="color-tile" style="background: {{Color}}"></span> {{Color}}
</script>
<script type="text/template" id="displayAmount">
<span class="{{AmountClass}}">${{Amount}}</span>
</script>
<script id="detailTemplate" type="text/template">
<table class="detail-row">
<tr>
<td>Size</td>
<td>: {{ProductDetail.Size}}</td>
</tr>
<tr>
<td>Weight</td>
<td>: {{ProductDetail.Weight}}</td>
</tr>
<tr>
<td>Quantity</td>
<td>: {{ProductDetail.Quantity}}</td>
</tr>
<tr>
<td>Description</td>
<td>: {{ProductDetail.Description}}</td>
</tr>
</table>
</script>
<!--END: Cell templates-->
<script>
// override the validation functions of jquery.validate.js
$.validator.methods.number = function (value, element) {
return this.optional(element) || /^\$?[0-9]\d*(\.\d+)?\%?$/.test(value);
}
</script>
<div id="control-nav-tabs" class="nav nav-tabs ui-helper-clearfix mob-hide-1">
<div>
<a>@Html.Raw(Resources.FlexGrid.ShowCase_Data_Text0)</a>
<div class="tab-pane pane-content mob-hide-1">
<div class="flex-container">
<div>@Html.Partial("_OptionsMenu", optionsModel)</div>
<div>@Html.Raw(Resources.FlexGrid.ShowCase_Search_Text0) <span id="theSearch" style="width:300px;"></span></div>
<div class="seperate"></div>
<div>
<div>
<img src="~/Content/images/icons/Columns.png" width="20" height="20" class="export-img" id="column-picker" />
@Html.Raw(Resources.FlexGrid.ShowCase_Columns_Text0)
</div>
<div style="display:none">
<div id="theColumnPicker" class="column-picker"></div>
</div>
</div>
</div>
</div>
</div>
<div>
<a>@Html.Raw(Resources.FlexGrid.ShowCase_Export_Text0)</a>
<div class="tab-pane pane-content mob-hide-1">
<div class="flex-container">
<div>
<img src="~/Content/images/icons/Excel.png" width="20" height="20" id="export-excel" class="export-img"/>Excel</div>
<div>
<img src="~/Content/images/icons/Csv.png" width="20" height="20" id="export-csv" class="export-img"/>Csv</div>
<div>
<img src="~/Content/images/icons/pdf.png" width="20" height="20" id="export-pdf" class="export-img"/>PDF</div>
</div>
</div>
</div>
</div>
@Html.C1().TabPanel("#control-nav-tabs")
@(Html.C1().FlexGrid<SaleShowCase>()
.Id("theFlexGrid")
.ShowGroupPanel(s => s
.MaxGroups(3)
.Placeholder(string.Format("{0}", Html.Raw(Resources.FlexGrid.GroupPanel_Placeholder1)))
)
.ShowDetailRow(d => d.DetailRowTemplateId("detailTemplate").DetailVisibilityMode(DetailVisibilityMode.ExpandMulti).IsAnimated(false))
.PinningType(PinningType.SingleColumn)
.AutoGenerateColumns(false)
.SortingType(AllowSorting.SingleColumn)
.SelectionMode(SelectionMode.CellRange)
.Bind(bl => bl.InitialItemsCount(Convert.ToBoolean(optionsModel.Options["Lazy Render"].CurrentValue) ? 100 : (int?)null).Bind(Model).OnClientQueryData("collectingQueryData").Update(Url.Action("GridShowCaseUpdate")))
.CssClass("grid")
.CopyHeaders(CopyHeader.Column)
.BigCheckboxes(true)
.LazyRender(Convert.ToBoolean(optionsModel.Options["Lazy Render"].CurrentValue))
.OnClientCellEditEnded("cellEditEnded")
.Columns(bl =>
{
bl.Add(cb => cb.Binding("ID").IsReadOnly(true));
bl.Add(cb => cb.Binding("Start").Format("MMM d yyyy").CellTemplate(ctp => ctp.EditTemplateId("edtDate")));
bl.Add(cb => cb.Binding("Country").Header("Country").Width("145").CellTemplate(ctb => ctb.TemplateId("countryShowing"))
.DataMap(dm => dm.DisplayMemberPath("Name")
.SelectedValuePath("Name")
.SortByDisplayValues(true)
.Bind(countries)));
bl.Add(cb => cb.Binding("Amount2").Header("Price").Format("c"));
bl.Add(cb => cb.Binding("History").IsReadOnly(true).Width("180").TemplateFunction("createSparkline"));
bl.Add(cb => cb.Binding("Color").Width("145").CellTemplate(ctb => ctb.TemplateId("colorShowing"))
.DataMap(dm => dm.DisplayMemberPath("Name")
.SelectedValuePath("Name")
.SortByDisplayValues(true)
.Bind(colors)));
bl.Add(cb => cb.Binding("Amount").Header("Change").IsReadOnly(true).Format("c").CellTemplate(ctb => ctb.TemplateId("displayAmount")));
bl.Add(cb => cb.Binding("Rank").Width("150").Align("center").CssClass("custom-rating").TemplateFunction("createRating"));
bl.Add(cb => cb.Binding("Active"));
bl.Add(cb => cb.Binding("Product").Width("145")
.DataMap(dm => dm.DisplayMemberPath("Name")
.SelectedValuePath("Name")
.SortByDisplayValues(true)
.Bind(products)));
bl.Add(cb => cb.Binding("Discount").Format("p0"));
bl.Add(cb => cb.Binding("End").Header("End Time").Format("hh:mm").IsRequired(false).CellTemplate(ctp => ctp.EditTemplateId("edtTime")));
})
.RefreshOnEdit(true)
.Filterable<SaleShowCase>(fl => fl.DefaultFilterType(FilterType.Both).ColumnFilters(cfsb =>
{
cfsb.Add(cfb => cfb.Column("History").FilterType(FilterType.None));
}))
)
@(Html.C1().FlexGridSearch("#theSearch")
.Grid("theFlexGrid")
.CssMatch("")
.Placeholder(string.Format("{0}", Html.Raw(Resources.FlexGrid.EnterTextSearch_Text0)))
)
@section Summary{
<p>@Html.Raw(Resources.FlexGrid.Index_Text0)</p>
}
@section Description{
@Html.Raw(Resources.FlexGrid.Index_Text1)
}
@section Scripts{
<script>
function cellEditEnded(sender, e) {
if (e.col === 2) { //Reload CountryFlag from server when Country change
sender.collectionView.commitEdit();
}
}
function collectingQueryData(sender, e) {
if (e.extraRequestData == null) {
e.extraRequestData = {};
}
@foreach (var menuName in optionsModel.Options.Keys.Select(ControlOptions.ToOptionName))
{
<text>
e.extraRequestData["@(menuName)"] = '@(optionsModel.Options[menuName].CurrentValue)';
</text>
}
}
// #START: TEMPLATE FUNCTION
function createRating(CellMaker) {
return CellMaker.makeRating({
range: [0, 5]
});
}
function createSparkline(CellMaker) {
return CellMaker.makeSparkline({
markers: wijmo.grid.cellmaker.SparklineMarkers.High | wijmo.grid.cellmaker.SparklineMarkers.Low
});
}
// #END: TEMPLATE FUNCTION
c1.documentReady(function () {
var grid = wijmo.Control.getControl('#theFlexGrid');
//#START: COLUMNS PICKER
let theColumnPicker = new wijmo.input.MultiSelectListBox('#theColumnPicker', {
itemsSource: grid.columns,
checkedMemberPath: 'visible',
displayMemberPath: 'header',
showFilterInput: true,
showSelectAllCheckbox: true,
lostFocus: function () { wijmo.hidePopup(theColumnPicker.hostElement) },
checkedItemsChanged: function (sender) {
grid.columns.forEach(function (item) { item.visible = false; });
sender.checkedItems.forEach(function (item) {
grid.columns.getColumn(item.binding).visible = true;
});
}
});
//
// show the column picker when the user clicks the top-left cell
document.getElementById('column-picker').addEventListener("click", function (e) {
let host = theColumnPicker.hostElement;
wijmo.showPopup(host, e.target, false, true, false);
theColumnPicker.focus();
});
//#END: COLUMNS PICKER
//#START: EXPORT
//Excel
document.getElementById("export-excel").addEventListener("click", function () {
wijmo.grid.xlsx.FlexGridXlsxConverter.save(grid, {
scaleMode: wijmo.grid.pdf.ScaleMode.PageWidth,
includeColumnHeaders: true,
includeStyles: false,
}, 'FlexGrid.xlsx');
});
//Pdf
document.getElementById("export-pdf").addEventListener("click", function () {
wijmo.grid.pdf.FlexGridPdfConverter.export(grid, 'FlexGrid.pdf', {
scaleMode: wijmo.grid.pdf.ScaleMode.PageWidth,
documentOptions: {
pageSettings: {
layout: wijmo.pdf.PdfPageOrientation.Portrait
},
header: {
declarative: {
text: '\t&[Page]\\&[Pages]'
}
},
footer: {
declarative: {
text: '\t&[Page]\\&[Pages]'
}
}
},
styles: {
cellStyle: {
backgroundColor: '#ffffff',
borderColor: '#c6c6c6'
},
altCellStyle: {
backgroundColor: '#f9f9f9'
},
groupCellStyle: {
backgroundColor: '#dddddd'
},
headerCellStyle: {
backgroundColor: '#eaeaea'
}
}
});
});
//csv
//function for converting CSV string into a downloadable file
function exportFile(csv, fileName) {
var fileType = 'txt/csv;charset=utf-8';
if (navigator.msSaveBlob) { // IE
navigator.msSaveBlob(new Blob([csv], {
type: fileType
}), fileName);
}
else {
var e = document.createElement('a');
e.setAttribute('href', 'data:' + fileType + ',' + encodeURIComponent(csv));
e.setAttribute('download', fileName);
e.style.display = 'none';
document.body.appendChild(e);
e.click();
document.body.removeChild(e);
}
}
//export grid to CSV
document.getElementById("export-csv").addEventListener("click", function () {
var rng = new wijmo.grid.CellRange(0, 0, grid.rows.length - 1, grid.columns.length - 1),
csv = grid.getClipString(rng, true, true);
exportFile(csv, 'FlexGrid.csv');
});
//#END: EXPORT
});
</script>
}
マニュアル