React 계층형 그리드 행 선택
React Hierarchical Grid의 Ignite UI for React 사용하면 사용자가 단일 또는 여러 행의 데이터를 대화형으로 선택, 강조 표시 또는 선택 해제할 수 있습니다. IgrHierarchicalGrid
에는 여러 가지 선택 모드가 있습니다.
React 행 선택 예제
아래 샘플은 세 가지 유형의 IgrHierarchicalGrid
행 선택 동작을 보여 줍니다. 아래 드롭다운을 사용하여 사용 가능한 각 선택 모드를 활성화합니다. 확인란을 사용하여 행 선택기 확인란을 숨기 거나 표시합니다 .
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/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 コピー
설정
에서 행 선택을 IgrHierarchicalGrid
설정하려면 속성을 설정하기만 하면 됩니다 rowSelection
. 이 속성은 열거형을 허용합니다 GridSelectionMode
.
GridSelectionMode
다음 모드를 노출합니다.
아래에서는 각각에 대해 더 자세히 살펴보겠습니다.
없음 선택
안에 IgrHierarchicalGrid
기본적으로 행 선택은 비활성화되어 있습니다(rowSelection
는 없음). 그래서 당신은 할 수 있습니다 안 와의 상호 작용을 통해 행을 선택하거나 선택 취소합니다. IgrHierarchicalGrid
UI에서 이러한 작업을 완료하는 유일한 방법은 제공된 API 메서드를 사용하는 것입니다.
단일 선택
이제 단일 행 선택을 쉽게 설정할 수 있습니다. 사용자가 해야 할 유일한 작업은 rowSelection
Single
속성으로 설정하는 것뿐입니다. 이렇게 하면 그리드 내에서 하나의 행만 선택할 수 있습니다. 행의 셀에 포커스를 두고 셀을 클릭하거나 스페이스 키를 눌러 행을 선택할 수 있으며, 물론 행 선택기 필드를 클릭하여 행을 선택할 수도 있습니다. 행이 선택되거나 선택 취소되면 RowSelectionChanging
이벤트가 발생합니다.
const handleRowSelection = (args: IgrRowSelectionEventArgs) => {
if (args.detail.added.length && args.detail.added[0 ] === 3 ) {
args.detail.cancel = true ;
}
}
<IgrHierarchicalGrid rowSelection ="single" autoGenerate ={true} allowFiltering ={true} onRowSelectionChanging ={handleRowSelection} >
</IgrHierarchicalGrid >
tsx
다중 선택
에서 여러 행 선택을 활성화하려면 IgrHierarchicalGrid
설정하기만 하면 됩니다. rowSelection
속성을 Multiple
. 이렇게 하면 각 행과 에서 행 선택기 필드를 사용할 수 있습니다. IgrHierarchicalGrid
머리글. 행 선택기를 사용하면 사용자가 여러 행을 선택할 수 있으며, 스크롤, 페이징 및 정렬 및 필터링과 같은 데이터 작업을 통해 선택 항목이 유지됩니다. 행은 셀을 클릭하거나 버튼을 눌러 선택할 수도 있습니다. 우주 셀에 초점이 맞춰져 있을 때 키입니다. 한 행을 선택하고 다른 행을 누른 상태에서 다른 행을 클릭하는 경우 교대 키를 누르면 전체 행 범위가 선택됩니다. 이 선택 모드에서 단일 행을 클릭하면 이전에 선택한 행의 선택이 취소됩니다. 만약 너라면 클릭 를 들고 있는 동안 ctrl 키 키를 누르면 행이 전환되고 이전 선택 항목이 유지됩니다.
<IgrHierarchicalGrid primaryKey ="ProductID" rowSelection ="multiple"
allowFiltering ={true} autoGenerate ={true} >
</IgrHierarchicalGrid >
tsx
노트
행 선택은 RowSelectionChanging
이벤트를 트리거합니다. 이 이벤트는 새 선택 , 이전 선택 , 이전 선택에서 추가 및 제거된 행에 대한 정보를 제공합니다. 또한 이벤트는 취소 가능 하므로 선택을 방지할 수 있습니다.
행 선택이 활성화되면 행 선택기가 표시되지만 표시하지 않으려면 hideRowSelectors
true 로 설정할 수 있습니다.
런타임 시 행 선택 모드 간에 전환하면 이전 행 선택 상태가 지워집니다.
API 사용
프로그래밍 방식으로 행 선택
아래 코드 조각을 사용하면 (primaryKey
통해) 하나 또는 여러 행을 동시에 선택할 수 있습니다. 또한 이 메서드의 두 번째 매개 변수는 이전 행 선택을 지울지 여부를 선택할 수 있는 부울 속성입니다. 이전 선택 사항은 기본적으로 유지됩니다.
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
이렇게 하면 ID가 1, 2 및 5인 데이터 항목에 해당하는 행이 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
- 이벤트가 자식 그리드에서 트리거되는 경우 이벤트가 발생하는 구성 요소에 대한 참조가 제공됩니다.
const handleRowSelectionChange = (args: IgrRowSelectionEventArgs) => {
args.detail.cancel = true ;
}
<IgrHierarchicalGrid onRowSelectionChanging ={handleRowSelectionChange} >
</IgrHierarchicalGrid >
tsx
모든 행 선택
제공하는 또 다른 유용한 API 메소드 IgrHierarchicalGrid
는 다음과 같습니다 selectAllRows
. 기본적으로 이 방법은 모든 데이터 행을 선택하지만 필터링이 적용되면 필터 조건과 일치하는 행만 선택됩니다. false 매개 변수 SelectAllRows(false)
로 메서드를 호출하면 필터링이 적용되더라도 항상 그리드의 모든 데이터를 선택합니다.
참고 selectAllRows
삭제된 행을 선택하지 않는다는 점을 명심하십시오.
모든 행 선택 취소
IgrHierarchicalGrid
deselectAllRows
기본적으로 모든 데이터 행의 선택을 취소하지만 필터링이 적용된 경우 필터 조건과 일치하는 행만 선택 취소하는 방법을 제공합니다. false 매개 변수 DeselectAllRows(false)
로 메서드를 호출하면 필터링이 적용되더라도 항상 모든 행 선택 상태가 지워집니다.
선택한 행을 얻는 방법
현재 선택된 행을 확인해야 하는 경우 selectedRows
getter를 사용하여 해당 행 ID를 얻을 수 있습니다.
function getSelectedRows() {
return gridRef.current.selectedRows;
}
tsx
또한 selectedRows
에 행 ID를 할당하면 그리드의 선택 상태를 변경할 수 있습니다.
const mySelectedRows = [1 ,2 ,3 ];
<IgrHierarchicalGrid primaryKey ="ProductID" rowSelection ="multiple" autoGenerate ={false} selectedRows ={mySelectedRows} >
</IgrHierarchicalGrid >
tsx
행 선택기 템플릿
에서 헤더 및 행 선택기를 IgrHierarchicalGrid
템플릿화할 수 있으며 다양한 시나리오에 유용한 기능을 제공하는 컨텍스트에 액세스할 수도 있습니다.
기본적으로 는 IgrHierarchicalGrid
행 선택기의 상위 컨테이너 또는 행 자체에서 모든 행 선택 상호 작용을 처리 하고 템플릿에 대한 상태 시각화만 남깁니다. 기본 기능을 재정의하는 것은 일반적으로 RowSelectionChanging 이벤트를 사용하여 수행해야 합니다. 기본 기능을 재정의하는 처리기를 사용하여 click
사용자 지정 템플릿을 구현하는 경우 올바른 행 상태를 유지하기 위해 이벤트의 전파를 중지해야 합니다.
행 템플릿
사용자 지정 행 선택기 템플릿을 만들려면 속성 내에서 IgrHierarchicalGrid
사용할 수 있습니다 rowSelectorTemplate
. 템플릿에서 암시적으로 제공된 컨텍스트 변수에 액세스할 수 있으며, 행의 상태에 대한 정보를 제공하는 속성이 있습니다.
이 속성은 selected
현재 행이 선택되었는지 여부를 표시하며, 이 속성은 index
행 인덱스에 액세스하는 데 사용할 수 있습니다.
const rowSelectorTemplate = (ctx: IgrRowSelectorTemplateContext) => {
if (ctx.implicit.selected) {
return (
<>
<div style ={{justifyContent: 'space-evenly ', display: 'flex ', width: '70px '}}>
<span > ${ctx.implicit.index}</span >
<IgrCheckbox checked > </IgrCheckbox >
</div >
</>
);
} else {
return (
<>
<div style ={{justifyContent: 'space-evenly ', display: 'flex ', width: '70px '}}>
<span > ${ctx.implicit.index}</span >
<IgrCheckbox > </IgrCheckbox >
</div >
</>
);
}
}
<IgrHierarchicalGrid primaryKey ="ProductID" rowSelection ="multiple" autoGenerate ="false" rowSelectorTemplate ={rowSelectorTemplate} >
</IgrHierarchicalGrid >
tsx
rowID
이 속성을 사용하여 행의 참조를 가져올 수 있습니다 IgrHierarchicalGrid
. 이는 행 선택기 요소에 핸들러를 click
구현할 때 유용합니다.
const rowSelectorTemplate = (ctx: IgrRowSelectorTemplateContext) => {
return (
<>
<IgrCheckbox onClick ={(event) => onSelectorClick(event, ctx.implicit.key)}>
</IgrCheckbox >
</>
);
}
tsx
위의 예에서 우리는 IgrCheckbox
그리고 우리는 바인딩 rowContext.selected
그것에 checked
재산. 여기에서 실제 모습을 확인하세요. 행 번호 매기기 데모 .
rowContext.select() 및 rowContext.deselect() 메소드는 IgrHierarchicalGrid의 템플릿 컨텍스트에 노출됩니다. 특히 자식 그리드에서 기본 기능을 재정의하는 클릭 처리기를 구현할 때 현재 행을 더 쉽게 전환할 수 있습니다.
사용자 지정 헤더 선택기 템플릿을 만들려면 내에서 IgrHierarchicalGrid
속성을 사용할 headSelectorTemplate
수 있습니다. 템플릿에서 헤더의 상태에 대한 정보를 제공하는 속성을 사용하여 암시적으로 제공된 컨텍스트 변수에 액세스할 수 있습니다.
이 속성은 selectedCount
현재 선택된 행 수를 표시하고 totalCount
총 행이 몇 개인지 보여줍니다. IgrHierarchicalGrid
const headSelectorTemplate = (ctx: IgrHeadSelectorTemplateContext) => {
return (
<>
{ctx.implicit.selectedCount} / {ctx.implicit.totalCount}
</>
);
};
tsx
selectedCount
and totalCount
속성을 사용하여 헤드 선택기를 선택해야 하는지 또는 불확정(부분적으로 선택)해야 하는지 결정할 수 있습니다.
const headSelectorTemplate = (ctx: IgrHeadSelectorTemplateContext) => {
const implicit : any = ctx.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/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
>
</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/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"
onRowSelectionChanging ={this.webHierarchicalGridRowSelectionConditional} >
<IgrPaginator
>
</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(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 참조
추가 리소스
우리 커뮤니티는 활동적이며 항상 새로운 아이디어를 환영합니다.