React Hierarchical Grid 行の選択
React Hierarchical Grid の Ignite UI for React 行選択機能を使用すると、ユーザーは 1 つまたは複数のデータ行を対話的に選択、ハイライト表示、または選択解除できます。IgrHierarchicalGrid
内に使用可能な選択モードがいくつかあります。
None (なし) 選択
Multiple (複数) 選択
Single (単一) 選択
React 行選択の例
以下のサンプルは、IgrHierarchicalGrid
の 3 種類の行選択 動作を示しています。以下のドロップダウンを使用して、利用可能な各選択モードを有効にします。チェックボックスを使用して、行セレクター チェックボックスを非表示または表示します。
import React from 'react' ;
import ReactDOM from 'react-dom/client' ;
import './index.css' ;
import { IgrBadgeModule } from "@infragistics/igniteui-react" ;
import { IgrPropertyEditorPanelModule } from "@infragistics/igniteui-react-layouts" ;
import { IgrHierarchicalGridModule } from "@infragistics/igniteui-react-grids" ;
import { IgrPropertyEditorPanel, IgrPropertyEditorPropertyDescription } from "@infragistics/igniteui-react-layouts" ;
import { IgrHierarchicalGrid, IgrColumn, IgrRowIsland } from "@infragistics/igniteui-react-grids" ;
import { ComponentRenderer, PropertyEditorPanelDescriptionModule, WebHierarchicalGridDescriptionModule } from "@infragistics/igniteui-react-core" ;
import SingersData from './SingersData.json' ;
import "@infragistics/igniteui-react-grids/grids/combined" ;
import "@infragistics/igniteui-react-grids/grids/themes/light/bootstrap.css" ;
import 'igniteui-webcomponents/themes/light/bootstrap.css' ;
const mods : any [] = [
IgrBadgeModule,
IgrPropertyEditorPanelModule,
IgrHierarchicalGridModule
];
mods.forEach((m) => m.register());
export default class Sample extends React.Component <any, any> {
private propertyEditorPanel1: IgrPropertyEditorPanel
private propertyEditorPanel1Ref(r: IgrPropertyEditorPanel) {
this .propertyEditorPanel1 = r;
this .setState({});
}
private selectionType: IgrPropertyEditorPropertyDescription
private hideRowSelectors: IgrPropertyEditorPropertyDescription
private hierarchicalGrid: IgrHierarchicalGrid
private hierarchicalGridRef(r: IgrHierarchicalGrid) {
this .hierarchicalGrid = r;
this .setState({});
}
constructor (props: any ) {
super (props);
this .propertyEditorPanel1Ref = this .propertyEditorPanel1Ref.bind(this );
this .hierarchicalGridRef = this .hierarchicalGridRef.bind(this );
}
public render (): JSX .Element {
return (
<div className ="container sample ig-typography" >
<div className ="options vertical" >
<IgrPropertyEditorPanel
target ={this.hierarchicalGrid}
descriptionType ="WebHierarchicalGrid"
isWrappingEnabled ="true"
isHorizontal ="true"
componentRenderer ={this.renderer}
ref ={this.propertyEditorPanel1Ref} >
<IgrPropertyEditorPropertyDescription
name ="selectionType"
propertyPath ="RowSelection" >
</IgrPropertyEditorPropertyDescription >
<IgrPropertyEditorPropertyDescription
name ="hideRowSelectors"
propertyPath ="HideRowSelectors" >
</IgrPropertyEditorPropertyDescription >
</IgrPropertyEditorPanel >
</div >
<div className ="container fill" >
<IgrHierarchicalGrid
autoGenerate ={false}
data ={this.singersData}
ref ={this.hierarchicalGridRef}
id ="hierarchicalGrid"
primaryKey ="ID"
allowFiltering ={true} >
<IgrColumn
field ="Artist" >
</IgrColumn >
<IgrColumn
field ="Photo"
dataType ="image" >
</IgrColumn >
<IgrColumn
field ="Debut" >
</IgrColumn >
<IgrColumn
field ="GrammyNominations"
header ="Grammy Nominations" >
</IgrColumn >
<IgrColumn
field ="GrammyAwards"
header ="Grammy Awards" >
</IgrColumn >
<IgrRowIsland
childDataKey ="Albums"
autoGenerate ={false} >
<IgrColumn
field ="Album" >
</IgrColumn >
<IgrColumn
field ="LaunchDate"
header ="Launch Date"
dataType ="date" >
</IgrColumn >
<IgrColumn
field ="BillboardReview"
header ="Billboard Review" >
</IgrColumn >
<IgrColumn
field ="USBillboard200"
header ="US Billboard 200" >
</IgrColumn >
<IgrRowIsland
childDataKey ="Songs"
autoGenerate ={false} >
<IgrColumn
field ="Number"
header ="No." >
</IgrColumn >
<IgrColumn
field ="Title" >
</IgrColumn >
<IgrColumn
field ="Released"
dataType ="date" >
</IgrColumn >
<IgrColumn
field ="Genre" >
</IgrColumn >
</IgrRowIsland >
</IgrRowIsland >
<IgrRowIsland
childDataKey ="Tours"
autoGenerate ={false} >
<IgrColumn
field ="Tour" >
</IgrColumn >
<IgrColumn
field ="StartedOn"
header ="Started on" >
</IgrColumn >
<IgrColumn
field ="Location" >
</IgrColumn >
<IgrColumn
field ="Headliner" >
</IgrColumn >
</IgrRowIsland >
</IgrHierarchicalGrid >
</div >
</div >
);
}
private _singersData: any [] = SingersData;
public get singersData(): any [] {
return this ._singersData;
}
private _componentRenderer: ComponentRenderer = null ;
public get renderer(): ComponentRenderer {
if (this ._componentRenderer == null ) {
this ._componentRenderer = new ComponentRenderer();
var context = this ._componentRenderer.context;
PropertyEditorPanelDescriptionModule.register(context);
WebHierarchicalGridDescriptionModule.register(context);
}
return this ._componentRenderer;
}
}
const root = ReactDOM.createRoot (document.getElementById('root' ));
root.render (<Sample /> );
tsx コピー
このサンプルが気に入りましたか? 完全な Ignite UI for Reactツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。
設定
IgrHierarchicalGrid
で項目の選択を設定するには、その rowSelection
プロパティを設定する必要があります。このプロパティは、GridSelectionMode
列挙を受け取ります。
GridSelectionMode
は以下のモードを公開します。
None (なし)
Single (単一)
Multiple (複数)
以下で、それぞれについて詳しく説明します。
None 選択
IgrHierarchicalGrid
では、デフォルトで行選択が無効になります。(rowSelection
は None です。)したがって、IgrHierarchicalGrid
UI とのインタラクションを通じて行を選択または選択解除することはできません が、選択/選択解除する唯一の方法は、提供された API メソッドを使用することです。
単一選択
単一行の選択は、rowSelection
プロパティ を Single
に設定することのみで簡単に設定できるようになりました。これにより、グリッド内の 1 行のみを選択できます 。行のセルにフォーカスするときにセルをクリックするかスペース キーを押すと行を選択できます。もちろん、行セレクターフィールドをクリックして行を選択できます。行が選択または選択解除されると、RowSelectionChanging
イベントが生成されます。
function handleRowSelection(args: IgrRowSelectionEventArgs) {
if (args.detail.added.length && args.detail.added[0 ] === 3 ) {
args.detail.cancel = true ;
}
}
<IgrHierarchicalGrid rowSelection ="single" autoGenerate ="true" allowFiltering ="true" rowSelectionChanging ={handleRowSelection} >
</IgrHierarchicalGrid >
tsx
複数選択
IgrHierarchicalGrid
で複数の項目を選択できるようにするには、rowSelection
プロパティを Multiple
に設定するだけです。これにより、各行および IgrHierarchicalGrid
ヘッダーで行セレクター フィールドが有効になります。行セレクターを使用して複数行を選択できます。選択はスクロール、ページング、およびソートとフィルター、などのデータ操作で保持されます。行を選択するには、セルをクリックするか、セルにフォーカスがあるときにスペース キーを押します。1 つの行を選択し、Shift キーを押しながら別の行をクリックすると、行の範囲全体が選択されます。この選択モードでは、単一の行をクリックすると、前に選択した行が選択解除されます。Ctrl キーを押しながらクリックすると、行が切り替わり、前の選択が保持されます。
<IgrHierarchicalGrid primaryKey ="ProductID" rowSelection ="multiple"
allowFiltering ="true" autoGenerate ="true" >
</IgrHierarchicalGrid >
tsx
注
行を選択すると、RowSelectionChanging
イベントがトリガーされます。このイベントは、新しい選択、古い選択、古い選択に対して追加および削除された行に関する情報を提供します。また、イベントはキャンセル可能であるため、選択を防ぐことができます。
行選択が有効になっている場合、行セレクターが表示されますが、表示しない場合は、hideRowSelectors
を true に設定できます。
行選択モードのランタイムを切り替えると、優先行選択状態がクリアされます。
API の使用
コードで行を選択
以下は、単一または複数の行を同時に選択できるコード例です (primaryKey
を介して)。さらに、このメソッドの 2 番目のパラメーターは boolean プロパティです。それを使用して、前の行の選択をクリアするかどうかを選択できます。以前の選択はデフォルトで保存されます。
function onClickSelect() {
gridRef.current.selectRows([1 ,2 ,5 ], true );
}
<IgrHierarchicalGrid primaryKey ="ProductID" rowSelection ="multiple" autoGenerate ="true" ref ={gridRef} >
</IgrHierarchicalGrid >
<button onClick ={onClickSelect} > Select 1 ,2 and 5 </button >
tsx
1、2、および 5 の ID を持つデータ エントリに対応する行を IgrHierarchicalGrid
の選択に追加します。
行選択の解除
プログラムで行を選択解除する必要がある場合は、deselectRows
メソッドを使用できます。
function onClickDeselect() {
gridRef.current.deselectRows([1 ,2 ,5 ]);
}
<IgrHierarchicalGrid primaryKey ="ProductID" rowSelection ="multiple" autoGenerate ="true" ref ={gridRef} >
</IgrHierarchicalGrid >
<button onClick ={onClickDeselect} > Deselect 1 ,2 and 5 </button >
tsx
行選択イベント
行選択に何らかの変更があると、RowSelectionChanging
イベントが発生します。RowSelectionChanging
は次の引数を公開します。
OldSelection
- 行選択の前の状態を含む行 ID の配列。
NewSelection
- 行選択の新しい状態に一致する行 ID の列。
Added
- 現在選択に追加されている行 ID の配列。
Removed
- 古い選択状態に従って現在削除されている行 ID の配列。
Event
- 行選択の変更をトリガーする元のイベント。
Cancel
- 行選択の変更を防ぐことができます。
Owner
- イベントが子グリッドからトリガーされる場合、これにより、イベントの発行元であるコンポーネントへの参照が提供されます。
function handleRowSelectionChange(args: IgrRowSelectionEventArgs) {
args.detail.cancel = true ;
}
<IgrHierarchicalGrid rowSelectionChanging ={handleRowSelectionChange} >
</IgrHierarchicalGrid >
tsx
すべての行の選択
IgrHierarchicalGrid
が提供するもう 1 つの便利な API メソッドが selectAllRows
です。このメソッドはデフォルトですべてのデータ行を選択しますが、フィルタリングが適用される場合、フィルター条件に一致する行のみが選択されます。ただし、false パラメーターを指定してメソッドを呼び出すと、SelectAllRows(false)
は、フィルターが適用されているかどうかに関係なく、常にグリッド内のすべてのデータを選択します。
注: selectAllRows
は削除された行を選択しないことに注意してください。
全行の選択解除
IgrHierarchicalGrid
は、デフォルトですべてのデータ行の選択を解除する deselectAllRows
メソッドを提供しますが、フィルタリングが適用される場合、フィルター条件に一致する行のみを選択解除します。ただし、false パラメーターを指定してメソッドを呼び出すと、DeselectAllRows(false)
は、フィルターが適用されているかどうかに関係なく、常にグリッド内のすべてのデータをクリアします。
選択した行を取得する方法
現在選択されている行を確認する必要がある場合は、selectedRows
ゲッターを使用して行 ID を取得できます。
public getSelectedRows ( ) {
const grid = document .getElementById('grid' ) as IgrHierarchicalGridComponent;
const currentSelection = grid.selectedRows;
}
typescript
function getSelectedRows() {
return gridRef.current.selectedRows;
}
tsx
さらに、selectedRows
に行 ID を割り当てると、グリッドの選択状態を変更できます。
public mySelectedRows = [1 , 2 , 3 ];
constructor ( ) {
const grid = document .getElementById('grid' ) as IgrHierarchicalGridComponent;
grid.data = this .data;
grid.selectedRows = this .mySelectedRows;
}
ts
const mySelectedRows = [1 ,2 ,3 ];
<IgrHierarchicalGrid primaryKey ="ProductID" rowSelection ="multiple" autoGenerate ="false" selectedRows ={mySelectedRows} >
</IgrHierarchicalGrid >
tsx
行セレクターのテンプレート
IgrHierarchicalGrid
でヘッダーおよび行セレクターをテンプレート化し、さまざまなシナリオに役立つ機能を提供するコンテキストにアクセスすることもできます。
デフォルトでは、IgrHierarchicalGrid
は、行セレクターの親コンテナまたは行自体のすべての行選択操作を処理し 、テンプレートの状態の可視化のみになります。基本機能のオーバーライドは通常、RowSelectionChanging イベント を使用して実行する必要があります。基本機能をオーバーライドする Click
ハンドラーを使用してカスタムテンプレートを実装する場合、イベントの伝播を停止して、正しい行の状態を保持する必要があります。
行テンプレート
カスタム行セレクター テンプレートを作成するには、IgrHierarchicalGrid
内で rowSelectorTemplate
プロパティを使用できます。テンプレートから、行の状態に関する情報を提供するプロパティを使用して、暗黙的に提供されたコンテキスト変数にアクセスできます。
selected
プロパティは現在の行が選択されているかどうかを示し、index
プロパティは行インデックスにアクセスするために使用できます。
function rowSelectorTemplate(ctx: IgrRowSelectorTemplateContext) {
if (ctx.dataContext.implicit.selected) {
return (
<>
<div style ={{justifyContent: 'space-evenly ', display: 'flex ', width: '70px '}}>
<span > ${ctx.dataContext.implicit.index}</span >
<IgrCheckbox checked > </IgrCheckbox >
</div >
</>
);
} else {
return (
<>
<div style ={{justifyContent: 'space-evenly ', display: 'flex ', width: '70px '}}>
<span > ${ctx.dataContext.implicit.index}</span >
<IgrCheckbox checked > </IgrCheckbox >
</div >
</>
);
}
}
<IgrHierarchicalGrid primaryKey ="ProductID" rowSelection ="multiple" autoGenerate ="false" rowSelectorTemplate ={rowSelectorTemplate} >
</IgrHierarchicalGrid >
tsx
rowID
プロパティを使用して、IgrHierarchicalGrid
行の参照を取得できます。行セレクター要素に click
ハンドラーを実装する場合に便利です。
public rowSelectorTemplate(ctx: IgrRowSelectorTemplateContext) {
return (
<>
<IgrCheckbox onClick ={(event) => onSelectorClick(event, ctx.dataContext.implicit.key)}>
</IgrCheckbox >
</>
);
}
tsx
上の例では、IgrCheckbox
を使用しており、rowContext.selected
をその checked
プロパティにバインドしています。行番号のデモ で実際にこれをご覧ください。
rowContext.select() および rowContext.deselect() メソッドは、IgrHierarchicalGrid のテンプレート コンテキストで公開されます。基本機能をオーバーライドするクリック ハンドラーを実装した場合、特に子グリッドで現在の行を簡単に切り替えることができます。
ヘッダー テンプレート
カスタム行ヘッダー セレクター テンプレートを作成するには、IgrHierarchicalGrid
内で headSelectorTemplate
プロパティを使用します。テンプレートから、ヘッダーの状態に関する情報を提供するプロパティを使用して、暗黙的に提供されたコンテキスト変数にアクセスできます。
SelectedCount
プロパティは現在選択されている行数を示し、totalCount
は IgrHierarchicalGrid
に合計の行数を示します。
function headSelectorTemplate(ctx: IgrHeadSelectorTemplateContext) {
return (
<>
{ctx.dataContext.implicit.selectedCount} / {ctx.dataContext.implicit.totalCount}
</>
);
};
tsx
SelectedCount
および TotalCount
プロパティを使用して、ヘッド セレクターをチェックするか、不確定にする(部分的に選択する)かを決定できます。
constructor ( ) {
const grid = document .getElementById('grid' ) as IgrHierarchicalGridComponent;
grid.data = this .data;
grid.headSelectorTemplate = this .headSelectorTemplate;
}
public headSelectorTemplate = (ctx: IgcHeadSelectorTemplateContext ) => {
const implicit: any = ctx.implicit;
if (implicit.selectedCount > 0 && implicit.selectedCount === implicit.totalCount) {
return html`<igc-checkbox checked > </igc-checkbox > ` ;
} else if (implicit.selectedCount > 0 && implicit.selectedCount !== implicit.totalCount) {
return html`<igc-checkbox indeterminate > </igc-checkbox > ` ;
}
return html`<igc-checkbox > </igc-checkbox > ` ;
}
ts
function headSelectorTemplate(ctx: IgcHeadSelectorTemplateContext) {
const implicit : any = ctx.dataContext.implicit;
if (implicit.selectedCount > 0 && implicit.selectedCount === implicit.totalCount) {
return (
<>
<IgrCheckbox checked > </IgrCheckbox >
</>
);
} else if (implicit.selectedCount > 0 && implicit.selectedCount !== implicit.totalCount) {
return (
<>
<IgrCheckbox indeterminate > </IgrCheckbox >
</>
);
}
return (
<>
<IgrCheckbox > </IgrCheckbox >
</>
);
}
<IgrHierarchicalGrid primaryKey ="ProductID" rowSelection ="multiple" autoGenerate ="true" headSelectorTemplate ={headSelectorTemplate} >
</IgrHierarchicalGrid >
tsx
IgrHierarchicalGrid
の各階層レベルには、独自の行とヘッダーのテンプレートを設定できます。
headContext.selectAll() および headContext.deselectAll() メソッドは、IgrHierarchicalGrid のテンプレート コンテキストで公開されます。基本機能をオーバーライドするクリック ハンドラーを実装した場合、特に子グリッドで現在の行を簡単に切り替えることができます。
行の番号付けデモ
このデモでは、カスタム ヘッダーと行セレクターの使用方法を示します。後者は、index
を使用して行番号と、selected
にバインドされた IgrCheckbox
を表示します。
import React from 'react' ;
import ReactDOM from 'react-dom/client' ;
import './index.css' ;
import { IgrHierarchicalGridModule } from "@infragistics/igniteui-react-grids" ;
import { IgrCheckboxModule } from "@infragistics/igniteui-react" ;
import { IgrHierarchicalGrid, IgrPaginator, IgrColumn, IgrRowIsland } from "@infragistics/igniteui-react-grids" ;
import { ComponentRenderer, WebHierarchicalGridDescriptionModule, WebCheckboxDescriptionModule } from "@infragistics/igniteui-react-core" ;
import SingersData from './SingersData.json' ;
import { IgrRowSelectorTemplateContext, IgrHeadSelectorTemplateContext } from "@infragistics/igniteui-react-grids" ;
import { IgrCheckbox } from "@infragistics/igniteui-react" ;
import "@infragistics/igniteui-react-grids/grids/combined" ;
import "@infragistics/igniteui-react-grids/grids/themes/light/bootstrap.css" ;
const mods : any [] = [
IgrHierarchicalGridModule,
IgrCheckboxModule
];
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 paginator: IgrPaginator
constructor (props: any ) {
super (props);
this .hierarchicalGridRef = this .hierarchicalGridRef.bind(this );
}
public render (): JSX .Element {
return (
<div className ="container sample ig-typography" >
<div className ="container fill" >
<IgrHierarchicalGrid
autoGenerate ={false}
data ={this.singersData}
ref ={this.hierarchicalGridRef}
id ="hierarchicalGrid"
primaryKey ="ID"
rowSelection ="multiple"
cellSelection ="none"
rowSelectorTemplate ={this.webGridRowSelectorTemplate}
headSelectorTemplate ={this.webGridHeaderRowSelectorTemplate} >
<IgrPaginator
name ="paginator" >
</IgrPaginator >
<IgrColumn
field ="Artist" >
</IgrColumn >
<IgrColumn
field ="Photo"
dataType ="image" >
</IgrColumn >
<IgrColumn
field ="Debut" >
</IgrColumn >
<IgrColumn
field ="GrammyNominations"
header ="Grammy Nominations" >
</IgrColumn >
<IgrColumn
field ="GrammyAwards"
header ="Grammy Awards" >
</IgrColumn >
<IgrRowIsland
childDataKey ="Albums"
autoGenerate ={false} >
<IgrColumn
field ="Album" >
</IgrColumn >
<IgrColumn
field ="LaunchDate"
header ="Launch Date"
dataType ="date" >
</IgrColumn >
<IgrColumn
field ="BillboardReview"
header ="Billboard Review" >
</IgrColumn >
<IgrColumn
field ="USBillboard200"
header ="US Billboard 200" >
</IgrColumn >
<IgrRowIsland
childDataKey ="Songs"
autoGenerate ={false} >
<IgrColumn
field ="Number"
header ="No." >
</IgrColumn >
<IgrColumn
field ="Title" >
</IgrColumn >
<IgrColumn
field ="Released"
dataType ="date" >
</IgrColumn >
<IgrColumn
field ="Genre" >
</IgrColumn >
</IgrRowIsland >
</IgrRowIsland >
<IgrRowIsland
childDataKey ="Tours"
autoGenerate ={false} >
<IgrColumn
field ="Tour" >
</IgrColumn >
<IgrColumn
field ="StartedOn"
header ="Started on" >
</IgrColumn >
<IgrColumn
field ="Location" >
</IgrColumn >
<IgrColumn
field ="Headliner" >
</IgrColumn >
</IgrRowIsland >
</IgrHierarchicalGrid >
</div >
</div >
);
}
private _singersData: any [] = SingersData;
public get singersData(): any [] {
return this ._singersData;
}
private _componentRenderer: ComponentRenderer = null ;
public get renderer(): ComponentRenderer {
if (this ._componentRenderer == null ) {
this ._componentRenderer = new ComponentRenderer();
var context = this ._componentRenderer.context;
WebHierarchicalGridDescriptionModule.register(context);
WebCheckboxDescriptionModule.register(context);
}
return this ._componentRenderer;
}
public webGridRowSelectorTemplate = (e: {dataContext: IgrRowSelectorTemplateContext}) => {
const contextDetail = e.dataContext.implicit;
const containerStyle = {
justifyContent: 'space-evenly' ,
display: 'flex' ,
width: '70px'
};
return (
<div style ={containerStyle} >
<span > {contextDetail.index}</span >
<IgrCheckbox checked ={contextDetail.selected} key ={ `${contextDetail.selected }`}> </IgrCheckbox >
</div >
);
}
public webGridHeaderRowSelectorTemplate = (e: {dataContext: IgrHeadSelectorTemplateContext }) => {
return (
<div style ={{width: '70px ', height: '60px ', display: 'flex '}}>
<img src ="https://www.infragistics.com/angular-demos-lob/assets/images/card/avatars/igLogo.png" className ="header-image" />
</div >
);
}
}
const root = ReactDOM.createRoot (document.getElementById('root' ));
root.render (<Sample /> );
tsx コピー
条件付き選択のデモ
このデモでは、RowSelectionChanging
イベントと、選択できない行のチェックボックスが無効になっているカスタム テンプレートを使用して、一部の行が選択されないようにします。
import React from 'react' ;
import ReactDOM from 'react-dom/client' ;
import './index.css' ;
import { IgrHierarchicalGridModule } from "@infragistics/igniteui-react-grids" ;
import { IgrHierarchicalGrid, IgrPaginator, IgrColumn, IgrRowIsland } from "@infragistics/igniteui-react-grids" ;
import { ComponentRenderer, WebHierarchicalGridDescriptionModule } from "@infragistics/igniteui-react-core" ;
import SingersData from './SingersData.json' ;
import { IgrRowSelectionEventArgs } 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 paginator: IgrPaginator
constructor (props: any ) {
super (props);
this .hierarchicalGridRef = this .hierarchicalGridRef.bind(this );
this .webHierarchicalGridRowSelectionConditional = this .webHierarchicalGridRowSelectionConditional.bind(this );
}
public render (): JSX .Element {
return (
<div className ="container sample ig-typography" >
<div className ="container fill" >
<IgrHierarchicalGrid
autoGenerate ={false}
data ={this.singersData}
ref ={this.hierarchicalGridRef}
id ="hierarchicalGrid"
primaryKey ="ID"
rowSelection ="multiple"
cellSelection ="none"
rowSelectionChanging ={this.webHierarchicalGridRowSelectionConditional} >
<IgrPaginator
name ="paginator" >
</IgrPaginator >
<IgrColumn
field ="Artist" >
</IgrColumn >
<IgrColumn
field ="Debut" >
</IgrColumn >
<IgrColumn
field ="GrammyNominations"
header ="Grammy Nominations" >
</IgrColumn >
<IgrColumn
field ="GrammyAwards"
header ="Grammy Awards" >
</IgrColumn >
<IgrRowIsland
childDataKey ="Albums"
autoGenerate ={false}
rowSelection ="multiple" >
<IgrColumn
field ="Album" >
</IgrColumn >
<IgrColumn
field ="LaunchDate"
header ="Launch Date"
dataType ="date" >
</IgrColumn >
<IgrColumn
field ="BillboardReview"
header ="Billboard Review" >
</IgrColumn >
<IgrColumn
field ="USBillboard200"
header ="US Billboard 200" >
</IgrColumn >
<IgrRowIsland
childDataKey ="Songs"
autoGenerate ={false}
rowSelection ="multiple" >
<IgrColumn
field ="Number"
header ="No." >
</IgrColumn >
<IgrColumn
field ="Title" >
</IgrColumn >
<IgrColumn
field ="Released"
dataType ="date" >
</IgrColumn >
<IgrColumn
field ="Genre" >
</IgrColumn >
</IgrRowIsland >
</IgrRowIsland >
<IgrRowIsland
childDataKey ="Tours"
autoGenerate ={false}
rowSelection ="multiple" >
<IgrColumn
field ="Tour" >
</IgrColumn >
<IgrColumn
field ="StartedOn"
header ="Started on" >
</IgrColumn >
<IgrColumn
field ="Location" >
</IgrColumn >
<IgrColumn
field ="Headliner" >
</IgrColumn >
</IgrRowIsland >
</IgrHierarchicalGrid >
</div >
</div >
);
}
private _singersData: any [] = SingersData;
public get singersData(): any [] {
return this ._singersData;
}
private _componentRenderer: ComponentRenderer = null ;
public get renderer(): ComponentRenderer {
if (this ._componentRenderer == null ) {
this ._componentRenderer = new ComponentRenderer();
var context = this ._componentRenderer.context;
WebHierarchicalGridDescriptionModule.register(context);
}
return this ._componentRenderer;
}
public webHierarchicalGridRowSelectionConditional(sender: IgrHierarchicalGrid, eventArgs: IgrRowSelectionEventArgs): void {
const event = eventArgs.detail;
if (!event.added.length && event.removed.length) {
return ;
}
var grid = this .hierarchicalGrid;
const originalAddedLength = event.added.length;
event.newSelection = event.newSelection.filter((x: any ) => x.HasGrammyAward);
if (event.newSelection.length
&& !event.newSelection.filter((x: any ) => event.oldSelection.indexOf(x) === -1 ).length
&& originalAddedLength > 1 ) {
event.newSelection = [];
}
}
}
const root = ReactDOM.createRoot (document.getElementById('root' ));
root.render (<Sample /> );
tsx コピー
API リファレンス
その他のリソース
コミュニティに参加して新しいアイデアをご提案ください。