FlexGrid
列ピッカー
このサンプルは、列ピッカーの使用方法を示します。
機能
サンプル
説明
このサンプルは、列ピッカーの使用方法を示します。
左上のセルにある歯車のアイコンをクリックして列ピッカーのドロップダウンリストを表示し、そこで表示したい列を選択することができます。
FlexGridの列レイアウトを保存および復元することもできます。必要に応じて、列のレイアウトを変更し、[列レイアウトの保存]をクリックして、変更を保存します。レイアウトをさらに変更できます。[列レイアウトのロード]をクリックすると、保存したレイアウトを復元できます。
ソース
ColumnPickerController.cs
using Microsoft.AspNetCore.Mvc;
using MvcExplorer.Models;
namespace MvcExplorer.Controllers
{
public partial class FlexGridController : Controller
{
public ActionResult ColumnPicker()
{
var model = Sale.GetData(50);
return View(model);
}
}
}
ColumnPicker.cshtml
@model IEnumerable<Sale>
@section Styles{
<style>
.column-picker-icon {
cursor: pointer;
}
.wj-multiselectlistbox.column-picker {
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
}
.wj-multiselectlistbox .wj-listbox-item > label {
display: block;
margin: 0 0 3px 0;
}
.wj-multiselectlistbox .wj-listbox-item.wj-state-selected {
background: transparent;
color: inherit;
}
.wj-multiselectlistbox .wj-listbox-item:hover {
background: rgba(0,0,0,.05);
}
.wj-multiselectlistbox .drop-marker {
position: absolute;
background: #0085c7;
opacity: 0.5;
pointer-events: none;
z-index: 1000;
}
</style>
}
@section Scripts{
<script type="text/javascript">
c1.documentReady(function () {
// Create the Column-picker dropdown list
var grid = wijmo.Control.getControl('#gridColumnPicker');
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;
});
}
});
// Config drag & drop for the Column-picker
configDragDropForColumnPicker(grid, theColumnPicker);
// Prepare for column-picker button
var tempBtnColPicker = document.getElementById('column-picker-icon');
tempBtnColPicker._columnPicker = theColumnPicker;
tempBtnColPicker._grid = grid;
});
function formatItem(panel, r, c, cell) {
if (panel.cellType == wijmo.grid.CellType.TopLeft) {
var tempBtnColPicker = document.getElementById('column-picker-icon'),
btnColPicker = tempBtnColPicker.cloneNode(true),
theColumnPicker = tempBtnColPicker._columnPicker,
grid = tempBtnColPicker._grid;
// Show the column picker when the user clicks at the corner top-left cell
btnColPicker.addEventListener("click", function (e) {
let host = theColumnPicker.hostElement;
if (host.offsetHeight) {
wijmo.hidePopup(host, true, true);
grid.focus();
}
else {
wijmo.showPopup(host, e.target, false, true, false);
theColumnPicker.focus();
}
e.preventDefault();
});
btnColPicker.addEventListener("mousedown", function (e) {
e.preventDefault();
e.stopPropagation();
});
cell.appendChild(btnColPicker);
if (theColumnPicker.hostElement.style.display != 'none') {
wijmo.showPopup(theColumnPicker.hostElement, btnColPicker, false, true, false);
}
}
}
// Config Column-picker's drag & drop
function configDragDropForColumnPicker(theGrid, theColumnPicker) {
var isDragEnabled = false,
dragSrc = null,
dragDst = null,
theColumnPickerListBox = theColumnPicker.listBox,
dragCheckbox = document.getElementById('enableDrag');
dragCheckbox.addEventListener('click', function (e) {
var element = e.target;
isDragEnabled = element.checked;
var host = theColumnPickerListBox.hostElement;
var items = host.getElementsByClassName('wj-listbox-item');
for (var i = 0; i < items.length; i++) {
enableDragItem(items[i], isDragEnabled);
}
});
theColumnPickerListBox.formatItem.addHandler(function (s, e) {
enableDragItem(e.item, isDragEnabled);
});
var theColumnPickerHost = theColumnPickerListBox.hostElement;
theColumnPickerHost.addEventListener('dragstart', handleDragStart);
theColumnPickerHost.addEventListener('dragover', handleDragOver);
theColumnPickerHost.addEventListener('drop', handleDrop);
theColumnPickerHost.addEventListener('dragend', handleDragEnd);
function enableDragItem(item, enabled) {
item.setAttribute('draggable', enabled);
}
function handleDragStart(e) {
dragSrc = wijmo.closest(e.target, '.wj-listbox-item');
if (dragSrc) {
e.dataTransfer.setData('text', dragSrc.innerHTML);
e.dataTransfer.effectAllowed = 'move';
}
}
function handleDragOver(e) {
// C1WEB-28851: Fix getting wrong target in IE
var target = document.elementFromPoint(e.clientX, e.clientY),
dragOver = wijmo.closest(target, '.wj-listbox-item');
if (dragDst && dragDst !== dragOver) {
removeDropMarker();
}
if (dragOver && dragOver !== dragSrc) {
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
dragDst = dragOver;
var src = getElementIndex(dragSrc);
var dst = getElementIndex(dragDst);
removeDropMarker();
addDropMarker(dst > src);
}
else {
dragDst = null;
}
}
function handleDrop(e) {
if (dragSrc && dragDst) {
e.preventDefault();
var src = theGrid.getColumn(dragSrc.innerText.trim()).index,
dst = theGrid.getColumn(dragDst.innerText.trim()).index;
theGrid.columns.moveElement(src, dst);
}
handleDragEnd();
}
function handleDragEnd() {
dragSrc = null;
dragDst = null;
removeDropMarker();
}
function getElementIndex(element) {
var parent = element.parentElement;
var siblings = Array.prototype.slice.call(parent.children);
return siblings.indexOf(element);
}
function removeDropMarker() {
wijmo.removeChild(wijmo.getElement('.drop-marker'));
}
function addDropMarker(isAfterPos) {
const height = 4;
const margin = 2;
var width = dragDst.clientWidth - margin;
var leftPos = margin;
var topPos = isAfterPos
? (dragDst.offsetTop + dragDst.clientHeight - height)
: (dragDst.offsetTop);
// C1WEB-28851: IE does not recornize the code, hence change to this
var html = '<div class="drop-marker" style="top:' + topPos + 'px;left:' + leftPos + 'px;height:' + height + 'px;width:' + width + 'px"></div>';
wijmo.createElement(html, theColumnPicker.hostElement);
}
}
// Save columns' layout to localStorage
function saveLayout() {
var grid = wijmo.Control.getControl("#gridColumnPicker");
localStorage['columns'] = grid.columnLayout;
}
// Restore columns' layout from localStorage
function loadLayout() {
var grid = wijmo.Control.getControl("#gridColumnPicker"),
columnLayout = localStorage['columns'];
if (columnLayout) {
grid.columnLayout = columnLayout;
}
}
</script>
}
<c1-flex-grid id="gridColumnPicker" auto-generate-columns="true" class="grid" is-read-only="true" item-formatter="formatItem">
<c1-items-source initial-items-count="100" source-collection="Model"></c1-items-source>
</c1-flex-grid>
<div class="checkbox">
<label>
<input id="enableDrag" type="checkbox"> @Html.Raw(FlexGridRes.ColumnPicker_Text2)
</label>
</div>
<div style="display:none">
<img id="column-picker-icon" class="column-picker-icon" src="~/Content/images/icons/Columns.png" width="20" height="20" />
<div id="theColumnPicker" class="column-picker" style="display:none"></div>
</div>
<input type="button" value="@FlexGridRes.ColumnPicker_Text4" class="btn" onclick="saveLayout()" />
<input type="button" value="@FlexGridRes.ColumnPicker_Text5" class="btn" onclick="loadLayout()" />
@section Summary{
<p>@Html.Raw(FlexGridRes.ColumnPicker_Text0)</p>
}
@section Description{
<p>@Html.Raw(FlexGridRes.ColumnPicker_Text0)</p>
<p>@Html.Raw(FlexGridRes.ColumnPicker_Text1)</p>
<p>@Html.Raw(FlexGridRes.ColumnPicker_Text3)</p>
}
マニュアル