React Hierarchical Grid 編集
React Hierarchical Grid の Ignite UI for React セル編集機能を使用すると、レコードの作成、更新、削除などのデータ操作を簡単に実行できます。IgrHierarchicalGrid
は、これらの操作をカスタマイズできる強力なパブリック API を提供します。データ操作のフェーズは次のとおりです。
設定
有効にする編集モードを指定するために、IgrHierarchicalGrid
は editable
および rowEditable
ブール値プロパティを公開します。
以下のオプションは、プロパティ editable
で指定できます。
- false - 対応する列の編集が無効になります 。これがデフォルト値です。
- true - 対応する列の編集が有効になります。
列が編集できない場合でも、IgrHierarchicalGrid
によって公開されるパブリック API を介して値を変更できます。
以下のオプションは、プロパティ rowEditable
で指定できます。
- false - 対応するグリッドの行編集は無効になります。これがデフォルト値です。
- true - 対応するグリッドで行編集が有効になります。
IgrHierarchicalGrid
で rowEditable
プロパティを true に設定し、editable
プロパティがどの列にも明示的に定義されていない場合、編集は主キー以外のすべての列で有効になります。
- セルおよび一括編集 - このシナリオでは、各セルの変更は個別に保持され、元に戻す/やり直し操作はセル レベルで使用できます。
- 行および一括編集 - このシナリオでは、変更は行レベルで保持されるため、元に戻す/やり直し操作は変更された各セルではなく、各行のセル全体に対して動作します。
テンプレートの編集
データ型固有の編集テンプレートを使用する場合、列 dataType
プロパティを指定する必要があります。次に各型のデフォルト テンプレートについて説明します。
string
データ型の場合、デフォルトのテンプレートは IgrInput
を使用します。
number
データ型のデフォルト テンプレートは IgrInput
type="number" を使用します。数値に解析できない値にセルを更新した場合、変更は無視されてセルの値が 0 に設定されます。
date
データ型ではデフォルトのテンプレートは IgrDatePicker
を使用します。
dateTime
データ型ではデフォルトのテンプレートは DateTimeEditor
を使用します。このエディターは、DateTime オブジェクトの入力要素部分のマスクを提供します。
time
データ型ではデフォルトのテンプレートは TimePicker
を使用します。
boolean
データ型ではデフォルトのテンプレートは IgrCheckbox
を使用します。
currency
データ型の場合、デフォルトのテンプレートは、アプリケーションまたはグリッドのロケール設定に基づいたプレフィックス/サフィックス構成の InputGroup
を使用します。
percent
パーセントデータ型の場合、デフォルトのテンプレートは、編集された値のプレビューをパーセントで表示するサフィックス要素を持つ InputGroup
を使用します。
すべての利用可能な列データ型は、公式の列タイプトピックにあります。
イベントの引数とシーケンス
グリッドは、編集エクスペリエンスをより詳細に制御できる広範なイベントを公開します。これらのイベントは、行の編集およびセルの編集のライフサイクル - 編集の開始、コミット、またはキャンセル時に発生します。
イベントのキャンセル
RowEditEnter
- Row
も Cell
も編集モードに入りません。
CellEditEnter
- セル編集に入ることを防止します。rowEditable
が有効な場合、セルの編集は禁止されたままですが、行の編集がトリガーされます。
CellEdit
- Cell
/Row
の編集を許可し、[完了] ボタンまたは [Enter] を押しても値または行のトランザクションはコミットされません。[キャンセル] ボタンをクリックするまで、セル編集と行編集は閉じません。
RowEdit
- 行全体ではなくセルのコミットは可能です。行は編集モードのままになり、行トランザクションは開いていると見なされます。[完了] を押しても、行をコミットまたは閉じません。[キャンセル] ボタンは、変更をコミットせずに編集プロセスとトランザクションを閉じます。
以下のサンプルは、実行中の編集実行シーケンスを示しています。
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import { IgrHierarchicalGridModule } from "@infragistics/igniteui-react-grids";
import { IgrHierarchicalGrid, IgrColumn, IgrRowIsland } from "@infragistics/igniteui-react-grids";
import SingersData from './SingersData.json';
import { IgrRowSelectionEventArgs, IgrGridEditEventArgs, IgrGridEditDoneEventArgs } from "@infragistics/igniteui-react-grids";
import "@infragistics/igniteui-react-grids/grids/combined";
import "@infragistics/igniteui-react-grids/grids/themes/light/bootstrap.css";
const mods: any[] = [
IgrHierarchicalGridModule
];
mods.forEach((m) => m.register());
export default class Sample extends React.Component<any, any> {
private hierarchicalGrid: IgrHierarchicalGrid
private hierarchicalGridRef(r: IgrHierarchicalGrid) {
this.hierarchicalGrid = r;
this.setState({});
}
private rowIsland: IgrRowIsland
constructor(props: any) {
super(props);
this.hierarchicalGridRef = this.hierarchicalGridRef.bind(this);
this.webHierarchicalGridRendered = this.webHierarchicalGridRendered.bind(this);
this.webHierarchicalGridRowEditEnter = this.webHierarchicalGridRowEditEnter.bind(this);
this.webHierarchicalGridRowEdit = this.webHierarchicalGridRowEdit.bind(this);
this.webHierarchicalGridRowEditDone = this.webHierarchicalGridRowEditDone.bind(this);
this.webHierarchicalGridRowEditExit = this.webHierarchicalGridRowEditExit.bind(this);
this.webHierarchicalGridCellEditEnter = this.webHierarchicalGridCellEditEnter.bind(this);
this.webHierarchicalGridCellEdit = this.webHierarchicalGridCellEdit.bind(this);
this.webHierarchicalGridCellEditExit = this.webHierarchicalGridCellEditExit.bind(this);
this.webRowIslandGridRowEditEnter = this.webRowIslandGridRowEditEnter.bind(this);
this.webRowIslandGridRowEdit = this.webRowIslandGridRowEdit.bind(this);
this.webRowIslandGridRowEditDone = this.webRowIslandGridRowEditDone.bind(this);
this.webRowIslandGridRowEditExit = this.webRowIslandGridRowEditExit.bind(this);
this.webRowIslandGridCellEditEnter = this.webRowIslandGridCellEditEnter.bind(this);
this.webRowIslandGridCellEdit = this.webRowIslandGridCellEdit.bind(this);
this.webRowIslandGridCellEditExit = this.webRowIslandGridCellEditExit.bind(this);
}
public render(): JSX.Element {
return (
<div className="container sample ig-typography">
<div className="container fill">
<IgrHierarchicalGrid
autoGenerate={false}
data={this.singersData}
primaryKey="ID"
id="hierarchicalGrid"
ref={this.hierarchicalGridRef}
rowEditable={true}
rendered={this.webHierarchicalGridRendered}
rowEditEnter={this.webHierarchicalGridRowEditEnter}
rowEdit={this.webHierarchicalGridRowEdit}
rowEditDone={this.webHierarchicalGridRowEditDone}
rowEditExit={this.webHierarchicalGridRowEditExit}
cellEditEnter={this.webHierarchicalGridCellEditEnter}
cellEdit={this.webHierarchicalGridCellEdit}
cellEditExit={this.webHierarchicalGridCellEditExit}>
<IgrColumn
field="Artist"
header="Artist"
dataType="string">
</IgrColumn>
<IgrColumn
field="HasGrammyAward"
header="Has Grammy Award"
dataType="boolean">
</IgrColumn>
<IgrColumn
field="Debut"
header="Debut"
dataType="number">
</IgrColumn>
<IgrColumn
field="GrammyNominations"
header="Grammy Nominations"
dataType="number">
</IgrColumn>
<IgrColumn
field="GrammyAwards"
header="Grammy Awards"
dataType="number">
</IgrColumn>
<IgrRowIsland
childDataKey="Albums"
autoGenerate={false}
name="rowIsland"
primaryKey="Album"
rowEditable={true}
rowEditEnter={this.webRowIslandGridRowEditEnter}
rowEdit={this.webRowIslandGridRowEdit}
rowEditDone={this.webRowIslandGridRowEditDone}
rowEditExit={this.webRowIslandGridRowEditExit}
cellEditEnter={this.webRowIslandGridCellEditEnter}
cellEdit={this.webRowIslandGridCellEdit}
cellEditExit={this.webRowIslandGridCellEditExit}>
<IgrColumn
field="Album"
header="Album"
dataType="string">
</IgrColumn>
<IgrColumn
field="LaunchDate"
header="Launch Date"
dataType="date">
</IgrColumn>
<IgrColumn
field="BillboardReview"
header="Billboard Review"
dataType="string">
</IgrColumn>
<IgrColumn
field="USBillboard200"
header="US Billboard 200"
dataType="string">
</IgrColumn>
</IgrRowIsland>
</IgrHierarchicalGrid>
</div>
</div>
);
}
private _singersData: any[] = SingersData;
public get singersData(): any[] {
return this._singersData;
}
public webHierarchicalGridRendered(args:any): void {
const hierarchicalGrid = document.getElementById("hierarchicalGrid");
hierarchicalGrid.parentElement.className = "fill";
hierarchicalGrid.parentElement.style.display = "flex";
hierarchicalGrid.parentElement.style.height = "100vh";
const container = document.createElement("div");
container.id = "container";
container.style.height = "80vh";
container.style.width = "100%";
container.style.overflow = "auto";
hierarchicalGrid.parentElement.appendChild(container);
const title = document.createElement("span");
title.textContent = "Events execution sequence:";
container.appendChild(title);
}
public webHierarchicalGridRowEditEnter(sender: IgrHierarchicalGrid, args: IgrGridEditEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Hierarchical Grid => 'rowEditEnter' with 'RowID':` + args.detail.rowID;
container.appendChild(message);
}
public webHierarchicalGridRowEdit(sender: IgrHierarchicalGrid, args: IgrGridEditEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Hierarchical Grid => 'rowEdit'`;
container.appendChild(message);
}
public webHierarchicalGridRowEditDone(sender: IgrHierarchicalGrid, args: IgrGridEditDoneEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Hierarchical Grid => 'rowEditDone'`;
container.appendChild(message);
}
public webHierarchicalGridRowEditExit(sender: IgrHierarchicalGrid, args: IgrGridEditDoneEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Hierarchical Grid => 'rowEditExit' << End of cycle >>`;
container.appendChild(message);
}
public webHierarchicalGridCellEditEnter(sender: IgrHierarchicalGrid, args: IgrGridEditEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Hierarchical Grid => 'cellEditEnter' with 'value':` + args.detail.oldValue, args.detail.cancel;
container.appendChild(message);
}
public webHierarchicalGridCellEdit(sender: IgrHierarchicalGrid, args: IgrGridEditEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Hierarchical Grid => 'cellEdit' with 'newValue':` + args.detail.newValue, args.detail.cancel;
container.appendChild(message);
}
public webHierarchicalGridCellEditExit(sender: IgrHierarchicalGrid, args: IgrGridEditDoneEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Hierarchical Grid => 'cellEditExit'`;
container.appendChild(message);
}
public webRowIslandGridRowEditEnter(sender: IgrRowIsland, args: IgrGridEditEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Row Island => 'rowEditEnter' with 'RowID':` + args.detail.rowID;
container.appendChild(message);
}
public webRowIslandGridRowEdit(sender: IgrRowIsland, args: IgrGridEditEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Row Island => 'rowEdit'`;
container.appendChild(message);
}
public webRowIslandGridRowEditDone(sender: IgrRowIsland, args: IgrGridEditDoneEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Row Island => 'rowEditDone'`;
container.appendChild(message);
}
public webRowIslandGridRowEditExit(sender: IgrRowIsland, args: IgrGridEditDoneEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Row Island => 'rowEditExit' << End of cycle >>`;
container.appendChild(message);
}
public webRowIslandGridCellEditEnter(sender: IgrRowIsland, args: IgrGridEditEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Row Island => 'cellEditEnter' with 'value':` + args.detail.oldValue, args.detail.cancel;
container.appendChild(message);
}
public webRowIslandGridCellEdit(sender: IgrRowIsland, args: IgrGridEditEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Row Island => 'cellEdit' with 'newValue':` + args.detail.newValue, args.detail.cancel;
container.appendChild(message);
}
public webRowIslandGridCellEditExit(sender: IgrRowIsland, args: IgrGridEditDoneEventArgs): void {
let container = document.getElementById("container");
const message = document.createElement("p");
message.textContent = `Row Island => 'cellEditExit'`;
container.appendChild(message);
}
}
// rendering above component in the React DOM
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Sample/>);
tsx
このサンプルが気に入りましたか? 完全な Ignite UI for Reactツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。
機能の統合
セル/行が編集モードの場合、ユーザーはさまざまな方法でグリッドを操作できます。以下のテーブルは、特定の操作が現在の編集にどのように影響するかを示しています。
Hierarchical Grid |
フィルタリング |
ソート |
ページング |
移動 |
ピン固定 |
非表示 |
グループ化 |
サイズ変更 |
Escape |
Enter |
F2 |
Tab |
セル クリック |
新しい行の追加/削除/編集 |
編集モードを保持 |
|
|
|
|
|
|
|
✔ |
|
|
|
|
|
|
編集モードを終了 |
✔ |
✔ |
✔ |
✔ |
✔ |
✔ |
✔ |
|
✔ |
✔ |
✔ |
✔ |
✔ |
✔ |
コミット |
|
|
|
|
|
|
|
|
|
✔ |
✔ |
✔ |
✔ |
✔ |
破棄 |
✔ |
✔ |
✔ |
✔ |
✔ |
✔ |
✔ |
|
✔ |
|
|
|
|
|
テーブルからわかるように、列のサイズ変更を除くすべての操作は編集を終了し、新しい値を破棄します。新しい値がコミットされる場合、対応する機能の 「-ing」 イベントで開発者が実行できます。
たとえば、ユーザーがセル/行が編集モードのときに列をソートしようとする場合に、新しい値をコミットする方法を示します:
function onSorting(grid: IgrHierarchicalGrid, event: IgrSortingEventArgs) {
grid.endEdit(true);
}
<IgrHierarchicalGrid data={localData} primaryKey="ProductID" sorting={onSorting}>
</IgrHierarchicalGrid>
tsx
API リファレンス
その他のリソース