Angular Tree Grid 複数列ヘッダーの概要
IgxTreeGrid
は、共通の列ヘッダー下で行のグループ化が可能な複数列ヘッダー
をサポートします。各複数列ヘッダーグループは、マテリアル UI グリッド内でその他複数のグループや列を組み合わせることができます。
Angular Tree Grid 複数列ヘッダーの例
import { NgModule } from "@angular/core" ;
import { FormsModule } from "@angular/forms" ;
import { BrowserModule } from "@angular/platform-browser" ;
import { BrowserAnimationsModule } from "@angular/platform-browser/animations" ;
import { AppComponent } from "./app.component" ;
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive" ;
import {
IgxTreeGridModule,
IgxButtonModule
} from "igniteui-angular" ;
import { TreeGridMultiColumnHeadersSampleComponent } from "./tree-grid-multi-column-headers-sample/tree-grid-multi-column-headers-sample.component" ;
@NgModule ({
bootstrap : [AppComponent],
declarations : [
AppComponent,
TreeGridMultiColumnHeadersSampleComponent
],
imports : [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxTreeGridModule,
IgxButtonModule
],
providers : [],
entryComponents : [],
schemas : []
})
export class AppModule {}
ts コピー import { Component, ViewChild } from '@angular/core' ;
import { GridSelectionMode, IgxTreeGridComponent} from 'igniteui-angular' ;
import { generateEmployeeDetailedFlatData } from '../data/employees-flat-detailed' ;
@Component ({
selector : 'app-tree-grid-multi-column-headers-sample' ,
styleUrls : ['./tree-grid-multi-column-headers-sample.component.scss' ],
templateUrl : './tree-grid-multi-column-headers-sample.component.html'
})
export class TreeGridMultiColumnHeadersSampleComponent {
@ViewChild (IgxTreeGridComponent, { read : IgxTreeGridComponent, static : true })
public treeGrid: IgxTreeGridComponent;
public data = generateEmployeeDetailedFlatData();
public selectionMode: GridSelectionMode = 'none' ;
public pinUnpinGroup ( ) {
const firstColumnGroup = this .treeGrid.columnList.filter((c ) => c.header === 'General Information' )[0 ];
firstColumnGroup.pinned = !firstColumnGroup.pinned;
}
public showHideGroup ( ) {
const firstColumnGroup = this .treeGrid.columnList.filter((c ) => c.header === 'General Information' )[0 ];
firstColumnGroup.hidden = !firstColumnGroup.hidden;
}
}
ts コピー <div class ="grid__wrapper" >
<igx-tree-grid [igxPreventDocumentScroll ]="true" #treeGrid [data ]="data" primaryKey ="ID" [moving ]="true" foreignKey ="ParentID" [rowSelection ]="selectionMode" height ="480px"
displayDensity ="compact" [allowFiltering ]="true" width ="100%" >
<igx-column field ="Name" dataType ="string" [sortable ]="true" [resizable ]="true" width ="200px" > </igx-column >
<igx-column-group [pinned ]="false" header ="General Information" >
<igx-column field ="HireDate" dataType ="date" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column-group header ="Personal Details" >
<igx-column field ="ID" dataType ="number" [resizable ]="true" [filterable ]="false" > </igx-column >
<igx-column field ="Title" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Age" dataType ="number" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-column-group header ="Address Information" >
<igx-column-group header ="Location" >
<igx-column field ="Country" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="City" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Address" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Fax" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="PostalCode" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-column-group header ="Address Information" >
<igx-column-group header ="Location" >
<igx-column field ="Country" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="City" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Address" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Fax" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="PostalCode" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Fax" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="PostalCode" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-tree-grid >
<section class ="button-section" >
<button igxButton ="raised" (click )="pinUnpinGroup()" > Pin/Unpin 'General Information' group</button >
<button igxButton ="raised" (click )="showHideGroup()" > Show/Hide 'General Information' group</button >
</section >
</div >
html コピー .grid__wrapper {
margin : 10px ;
}
.igx-button--raised {
margin-right : 5px ;
}
scss コピー
このサンプルが気に入りましたか? 完全な Ignite UI for Angularツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。
Multi-column header
の宣言は列セットを igx-column-group
コンポーネントと渡された header
タイトルにラップして行います。
<igx-tree-grid [data ]="data" primaryKey ="ID" foreignKey ="ParentID" >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Fax" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="PostalCode" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-tree-grid >
html
ネスト ヘッダーの n-th
レベルは、上記の宣言に従います。igx-column-group
をネストしてください。
<igx-tree-grid [data ]="data" primaryKey ="ID" foreignKey ="ParentID" [moving ]="true" >
<igx-column-group [pinned ]="false" header ="General Information" >
<igx-column field ="HireDate" dataType ="date" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column-group header ="Person Details" >
<igx-column field ="ID" dataType ="number" [resizable ]="true" [filterable ]="false" > </igx-column >
<igx-column field ="Title" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Age" dataType ="number" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-column-group >
</igx-tree-grid >
html
各 igx-column-group
は、移動
、ピン固定
と 非表示
をサポートします。
列セットと列グループがある場合、ピン固定は列の一番上の親レベルでのみ可能です。ネストした column groups
や columns
のピン固定はできません。
複数列ヘッダーでのピン固定を使用すると、グループ全体がピン固定されることに注意してください。
columns
と column groups
間の移動は、階層の同じレベルで同じ group
の場合のみです。
columns/column-groups
が現在の group
でラップされない場合 (一番上のレベル columns
の場合)、表示列全体の移動はできません。
<igx-tree-grid [data ]="data" primaryKey ="ID" foreignKey ="ParentID" [moving ]="true" >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
<igx-column field ="Name" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Title" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Age" dataType ="number" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-tree-grid >
html
複数列ヘッダー テンプレート
グリッドの各列グループは個別のテンプレートを持つことができます。列グループは、igxHeader
ディレクティブで装飾された ng-template
タグを必要とします。
ng-template
は、列グループ オブジェクトと共にコンテキストとして提供されています。
...
<igx-column-group header ="General Information" >
<ng-template igxHeader let-columnGroup >
{{ columnGroup.header | uppercase }}
</ng-template >
...
</igx-column-group >
...
html
複数の列グループに対して単一のテンプレートを再利用する場合は、以下のように列グループの headerTemplate
プロパティを設定できます。
<ng-template #columnGroupHeaderTemplate let-columnGroup >
{{ columnGroup.header | uppercase }}
</ng-template >
...
<igx-column-group header ="General Information" [headerTemplate ]="columnGroupHeaderTemplate" >
...
</igx-column-group >
<igx-column-group header ="Address Information" [headerTemplate ]="columnGroupHeaderTemplate" >
...
</igx-column-group >
...
html
ヘッダーが再テンプレート化され、対応する列グループが移動可能な場合は、テンプレート要素で draggable 属性を false に設定する必要があり、これにより適用されるイベントをすべて処理できます。
<ng-template igxHeader >
<igx-icon [attr.draggable ]="false" (click )="onClick()" > </igx-icon >
</ng-template >
html
次のサンプルは、ヘッダー テンプレートを使用して折りたたみ可能な列グループを実装する方法を示しています。
import { NgModule } from "@angular/core" ;
import { FormsModule } from "@angular/forms" ;
import { BrowserModule } from "@angular/platform-browser" ;
import { BrowserAnimationsModule } from "@angular/platform-browser/animations" ;
import { AppComponent } from "./app.component" ;
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive" ;
import { IgxTreeGridModule } from "igniteui-angular" ;
import { TreeGridMultiColumnHeaderTemplateSampleComponent } from "./tree-grid-multi-column-header-template-sample/tree-grid-multi-column-header-template-sample.component" ;
@NgModule ({
bootstrap : [AppComponent],
declarations : [
AppComponent,
TreeGridMultiColumnHeaderTemplateSampleComponent
],
imports : [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxTreeGridModule
],
providers : [],
entryComponents : [],
schemas : []
})
export class AppModule {}
ts コピー import { Component, ViewChild } from '@angular/core' ;
import { GridSelectionMode, IgxColumnGroupComponent, IgxTreeGridComponent } from 'igniteui-angular' ;
import { generateEmployeeDetailedFlatData } from '../data/employees-flat-detailed' ;
@Component ({
selector : 'app-tree-grid-multi-column-header-template-sample' ,
styleUrls : ['./tree-grid-multi-column-header-template-sample.component.scss' ],
templateUrl : './tree-grid-multi-column-header-template-sample.component.html'
})
export class TreeGridMultiColumnHeaderTemplateSampleComponent {
@ViewChild (IgxTreeGridComponent, { read : IgxTreeGridComponent, static : true })
public treeGrid: IgxTreeGridComponent;
public data: any [] = generateEmployeeDetailedFlatData();
public columnGroupStates = new Map <IgxColumnGroupComponent, boolean >();
public selectionMode: GridSelectionMode = 'none' ;
constructor ( ) {
for (const item of this .data) {
item.Location = `${item.Address} , ${item.City} , ${item.Country} ` ;
}
}
public toggleColumnGroup (columnGroup: IgxColumnGroupComponent ) {
const columns = columnGroup.children.toArray();
if (columnGroup.header === 'General Information' ) {
const col = columns[1 ];
col.hidden = !col.hidden;
} else if (columnGroup.header === 'Address Information' ) {
for (const col of columns) {
col.hidden = !col.hidden;
}
}
this .columnGroupStates.set(columnGroup, !this .columnGroupStates.get(columnGroup));
}
}
ts コピー <div class ="grid__wrapper" >
<ng-template #columnGroupTemplate let-col >
<div class ="column-group-template__container" >
<igx-icon [attr.draggable ]="false"
(click )="toggleColumnGroup(col)"
class ="column-group-template__icon" >
{{columnGroupStates.get(col) ? 'expand_more' : 'expand_less'}}</igx-icon >
{{col.header}}
</div >
</ng-template >
<igx-tree-grid [igxPreventDocumentScroll ]="true" #treeGrid [data ]="data" primaryKey ="ID" [moving ]="true" foreignKey ="ParentID" [rowSelection ]="selectionMode" height ="520px"
displayDensity ="compact" [allowFiltering ]="true" width ="100%" >
<igx-column field ="Name" dataType ="string" [sortable ]="true" [resizable ]="true" width ="200px" > </igx-column >
<igx-column-group [pinned ]="false" header ="General Information" [headerTemplate ]="columnGroupTemplate" >
<igx-column field ="HireDate" dataType ="date" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column-group header ="Personal Details" >
<igx-column field ="ID" dataType ="number" [resizable ]="true" [filterable ]="false" > </igx-column >
<igx-column field ="Title" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Age" dataType ="number" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-column-group header ="Address Information" [headerTemplate ]="columnGroupTemplate" >
<igx-column [sortable ]="true" [resizable ]="true" field ="Location" [hidden ]="true" > </igx-column >
<igx-column [sortable ]="true" [resizable ]="true" field ="Phone" [hidden ]="true" > </igx-column >
<igx-column-group header ="Location" >
<igx-column field ="Country" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="City" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Address" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Fax" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="PostalCode" dataType ="string" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-column-group >
</igx-tree-grid >
</div >
html コピー .grid__wrapper {
margin : 10px ;
}
.column-group-template__container {
display : flex;
align-items : center;
}
.column-group-template__icon {
cursor : pointer;
}
scss コピー
スタイル設定
ソート動作のスタイル設定は、すべてのテーマ関数とコンポーネント ミックスインが存在する index
ファイルをインポートする必要があります。
@use "igniteui-angular/theming" as *;
scss
最も単純なアプローチに従って、grid-theme
を拡張する新しいテーマを作成し、$header-background
、$header-text-color
、$header-border-width
、$header-border-style
および $header-border-color
パラメーターを受け取ります。
$custom-theme : grid-theme(
$header-background : #e0f3ff ,
$header-text-color : #e41c77 ,
$header-border-width : 1px ,
$header-border-style : solid,
$header-border-color : rgba(0 , 0 , 0 , 0.08 )
);
scss
上記のようにカラーの値をハードコーディングする代わりに、palette
および color
関数を使用してカラーに関してより高い柔軟性を実現することができます。使い方の詳細についてはパレット
のトピックをご覧ください。
最後の手順は、それぞれのテーマを持つコンポーネント ミックスインを含める ことです。
@include css-vars($custom-theme );
scss
デモ
import { NgModule } from "@angular/core" ;
import { FormsModule } from "@angular/forms" ;
import { BrowserModule } from "@angular/platform-browser" ;
import { BrowserAnimationsModule } from "@angular/platform-browser/animations" ;
import { AppComponent } from "./app.component" ;
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive" ;
import {
IgxTreeGridModule,
IgxButtonModule
} from "igniteui-angular" ;
import { TreeGridMultiColumnHeadersStylingComponent } from "./tree-grid-multi-column-headers-styling/tree-grid-multi-column-headers-styling.component" ;
@NgModule ({
bootstrap : [AppComponent],
declarations : [
AppComponent,
TreeGridMultiColumnHeadersStylingComponent
],
imports : [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxTreeGridModule,
IgxButtonModule
],
providers : [],
entryComponents : [],
schemas : []
})
export class AppModule {}
ts コピー import { Component } from '@angular/core' ;
import { generateEmployeeDetailedFlatData } from '../data/employees-flat-detailed' ;
@Component ({
selector : 'app-tree-grid-multi-column-headers-styling' ,
styleUrls : ['./tree-grid-multi-column-headers-styling.component.scss' ],
templateUrl : './tree-grid-multi-column-headers-styling.component.html'
})
export class TreeGridMultiColumnHeadersStylingComponent {
public data = generateEmployeeDetailedFlatData();
}
ts コピー <div class ="grid__wrapper" >
<igx-tree-grid [igxPreventDocumentScroll ]="true" #treeGrid [data ]="data" primaryKey ="ID" foreignKey ="ParentID" height ="480px"
displayDensity ="compact" width ="100%" >
<igx-column field ="Name" dataType ="string" width ="200px" > </igx-column >
<igx-column-group header ="General Information" >
<igx-column field ="HireDate" dataType ="date" > </igx-column >
<igx-column-group header ="Personal Details" >
<igx-column field ="ID" dataType ="number" > </igx-column >
<igx-column field ="Title" dataType ="string" > </igx-column >
<igx-column field ="Age" dataType ="number" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-column-group header ="Address Information" >
<igx-column-group header ="Location" >
<igx-column field ="Country" dataType ="string" > </igx-column >
<igx-column field ="City" dataType ="string" > </igx-column >
<igx-column field ="Address" dataType ="string" > </igx-column >
</igx-column-group >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" dataType ="string" > </igx-column >
<igx-column field ="Fax" dataType ="string" > </igx-column >
<igx-column field ="PostalCode" dataType ="string" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-column-group header ="Address Information" >
<igx-column-group header ="Location" >
<igx-column field ="Country" dataType ="string" > </igx-column >
<igx-column field ="City" dataType ="string" > </igx-column >
<igx-column field ="Address" dataType ="string" > </igx-column >
</igx-column-group >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" dataType ="string" > </igx-column >
<igx-column field ="Fax" dataType ="string" > </igx-column >
<igx-column field ="PostalCode" dataType ="string" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" dataType ="string" > </igx-column >
<igx-column field ="Fax" dataType ="string" > </igx-column >
<igx-column field ="PostalCode" dataType ="string" > </igx-column >
</igx-column-group >
</igx-tree-grid >
</div >
html コピー @use '../../variables' as *;
$custom-theme : grid-theme(
$header-background : #e0f3ff ,
$header-text-color : #e41c77 ,
$header-border-width : 1px ,
$header-border-style : solid,
$header-border-color : rgba(0 , 0 , 0 , 0.08 )
);
:host ::ng-deep {
@include css-vars($custom-theme );
}
.grid__wrapper {
margin : 10px ;
}
scss コピー
このサンプルは、Change Theme
(テーマの変更) から選択したグローバル テーマに影響を受けません。
API リファレンス
その他のリソース
コミュニティに参加して新しいアイデアをご提案ください。