Angular Hierarchical Grid 複数列ヘッダーの概要
IgxHierarchicalGrid
は、共通の列ヘッダー下で行のグループ化が可能な複数列ヘッダー
をサポートします。各複数列ヘッダーグループは、マテリアル UI グリッド内でその他複数のグループや列を組み合わせることができます。
Angular Hierarchical 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 { IgxHierarchicalGridModule } from "igniteui-angular" ;
import { HGridMultiHeadersSampleComponent } from "./hierarchical-grid/hierarchical-grid-multi-column-headers/hierarchical-grid-multi-column.component" ;
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive" ;
@NgModule ({
bootstrap : [AppComponent],
declarations : [
AppComponent,
HGridMultiHeadersSampleComponent
],
imports : [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule
],
providers : [],
entryComponents : [],
schemas : []
})
export class AppModule {}
ts コピー import { Component, OnInit, ViewChild } from '@angular/core' ;
import { IgxHierarchicalGridComponent } from 'igniteui-angular' ;
import { CUSTOMERS } from '../../data/hierarchical-data' ;
@Component ({
selector : 'app-hierarchical-grid-multi-column' ,
styleUrls : ['./hierarchical-grid-multi-column.component.scss' ],
templateUrl : 'hierarchical-grid-multi-column.component.html'
})
export class HGridMultiHeadersSampleComponent implements OnInit {
@ViewChild ('hierarchicalGrid' , { static : true })
private hierarchicalGrid: IgxHierarchicalGridComponent;
public localdata;
constructor ( ) {
}
public ngOnInit(): void {
this .localdata = CUSTOMERS;
}
public pinGroup ( ) {
const firstColumnGroup = this .hierarchicalGrid.columnList.filter((c ) => c.header === 'General Information' )[0 ];
firstColumnGroup.pinned = !firstColumnGroup.pinned;
}
public hideGroup ( ) {
const firstColumnGroup = this .hierarchicalGrid.columnList.filter((c ) => c.header === 'General Information' )[0 ];
firstColumnGroup.hidden = !firstColumnGroup.hidden;
}
}
ts コピー <div class ="grid__wrapper" >
<igx-hierarchical-grid [igxPreventDocumentScroll ]="true" #hierarchicalGrid [data ]="localdata" [height ]="'480px'" [moving ]="true" [width ]="'100%'" displayDensity ="compact" [allowFiltering ]="true" >
<igx-column field ="CustomerID" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column-group [pinned ]="false" header ="General Information" >
<igx-column field ="CompanyName" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column-group header ="Personal Details" >
<igx-column field ="ContactName" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="ContactTitle" [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 ="Address" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="City" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="PostalCode" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Country" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Fax" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-row-island [height ]="null" [key ]="'Orders'" [autoGenerate ]="false" [moving ]="true" >
<igx-column-group header ="Order Information" >
<igx-column-group header ="Order Details" >
<igx-column field ="OrderID" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="EmployeeID" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="OrderDate" [sortable ]="true" [resizable ]="true" [dataType ]="'date'" > </igx-column >
<igx-column field ="RequiredDate" [sortable ]="true" [resizable ]="true" [dataType ]="'date'" > </igx-column >
</igx-column-group >
<igx-column-group header ="General Shipping Information" >
<igx-column field ="ShippedDate" [sortable ]="true" [resizable ]="true" [dataType ]="'date'" > </igx-column >
<igx-column field ="ShipVia" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Freight" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="ShipName" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
<igx-column-group header ="Shipping Location" >
<igx-column field ="ShipAddress" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="ShipCity" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="ShipPostalCode" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="ShipCountry" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-row-island [height ]="null" [key ]="'OrderDetails'" [autoGenerate ]="false" >
<igx-column field ="ProductID" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="UnitPrice" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Quantity" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Discount" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-row-island >
</igx-row-island >
</igx-hierarchical-grid >
<section class ="button-section" >
<button igxButton ="raised" (click )="pinGroup()" > Pin first group</button >
<button igxButton ="raised" (click )="hideGroup()" > Hide first group</button >
</section >
</div >
html コピー .grid__wrapper {
margin : 16px ;
}
.igx-button--raised {
margin-right : 5px ;
}
scss コピー
このサンプルが気に入りましたか? 完全な Ignite UI for Angularツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。
Multi-column header
の宣言は列セットを igx-column-group
コンポーネントと渡された header
タイトルにラップして行います。
<igx-hierarchical-grid [data ]="localdata" [moving ]="true" [allowFiltering ]="true" >
<igx-column field ="CustomerID" sortable ="true" resizable ="true" > </igx-column >
<igx-column-group header ="Address Information" >
<igx-column-group header ="Location" >
<igx-column field ="Address" sortable ="true" resizable ="true" > </igx-column >
<igx-column field ="City" sortable ="true" resizable ="true" > </igx-column >
<igx-column field ="PostalCode" sortable ="true" resizable ="true" > </igx-column >
<igx-column field ="Country" sortable ="true" resizable ="true" > </igx-column >
</igx-column-group >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" sortable ="true" resizable ="true" > </igx-column >
<igx-column field ="Fax" sortable ="true" resizable ="true" > </igx-column >
</igx-column-group >
</igx-column-group >
</igx-hierarchical-grid >
html
ネスト ヘッダーの n-th
レベルは、上記の宣言に従います。igx-column-group
をネストしてください。
<igx-hierarchical-grid [data ]="localdata" [allowFiltering ]="true" [moving ]="true" >
<igx-column field ="CustomerID" sortable ="true" resizable ="true" > </igx-column >
<igx-column-group [pinned ]="false" header ="General Information" >
<igx-column field ="CompanyName" sortable ="true" resizable ="true" > </igx-column >
<igx-column-group header ="Person Details" >
<igx-column field ="ContactName" sortable ="true" resizable ="true" > </igx-column >
<igx-column field ="ContactTitle" sortable ="true" resizable ="true" > </igx-column >
</igx-column-group >
</igx-column-group >
</igx-hierarchical-grid >
html
各 igx-column-group
は、移動
、ピン固定
と 非表示
をサポートします。
列セットと列グループがある場合、ピン固定は列の一番上の親レベルでのみ可能です。ネストした column groups
や columns
のピン固定はできません。
複数列ヘッダーでのピン固定を使用すると、グループ全体がピン固定されることに注意してください。
columns
と column groups
間の移動は、階層の同じレベルで同じ group
の場合のみです。
columns/column-groups
が現在の group
でラップされない場合 (一番上のレベル columns
の場合)、表示列全体の移動はできません。
<igx-hierarchical-grid [data ]="localdata" [allowFiltering ]="true" [moving ]="true" >
<igx-column field ="CustomerID" sortable ="true" resizable ="true" > </igx-column >
<igx-column-group [pinned ]="false" header ="General Information" >
<igx-column field ="CompanyName" sortable ="true" resizable ="true" > </igx-column >
<igx-column-group header ="Person Details" >
<igx-column field ="ContactName" sortable ="true" resizable ="true" > </igx-column >
<igx-column field ="ContactTitle" sortable ="true" resizable ="true" > </igx-column >
</igx-column-group >
</igx-column-group >
...
</igx-hierarchical-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 { IgxHierarchicalGridModule } from "igniteui-angular" ;
import { HGridMultiHeaderTemplateSampleComponent } from "./hierarchical-grid/hierarchical-grid-multi-column-header-template/hierarchical-grid-multi-column-template.component" ;
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive" ;
@NgModule ({
bootstrap : [AppComponent],
declarations : [
AppComponent,
HGridMultiHeaderTemplateSampleComponent
],
imports : [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule
],
providers : [],
entryComponents : [],
schemas : []
})
export class AppModule {}
ts コピー import { Component, OnInit, ViewChild } from '@angular/core' ;
import { IgxColumnGroupComponent, IgxHierarchicalGridComponent } from 'igniteui-angular' ;
import { CUSTOMERS } from '../../data/hierarchical-data' ;
@Component ({
selector : 'app-hierarchical-grid-multi-column-template' ,
styleUrls : ['./hierarchical-grid-multi-column-template.component.scss' ],
templateUrl : 'hierarchical-grid-multi-column-template.component.html'
})
export class HGridMultiHeaderTemplateSampleComponent implements OnInit {
@ViewChild ('hierarchicalGrid' , { read : IgxHierarchicalGridComponent, static : true })
private hierarchicalGrid: IgxHierarchicalGridComponent;
public localData: any [];
public columnGroupStates = new Map <IgxColumnGroupComponent, boolean >();
constructor ( ) {
}
public ngOnInit(): void {
this .localData = CUSTOMERS;
for (const item of this .localData) {
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;
}
} else {
for (let i = 1 ; i < columns.length; i++) {
const col = columns[i];
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-hierarchical-grid [igxPreventDocumentScroll ]="true" #hierarchicalGrid [data ]="localData" [moving ]="true" [height ]="'500px'" [width ]="'100%'" displayDensity ="compact" [allowFiltering ]="true" >
<igx-column field ="CustomerID" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column-group [pinned ]="false" header ="General Information" [headerTemplate ]="columnGroupTemplate" >
<igx-column field ="CompanyName" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column-group header ="Personal Details" >
<igx-column field ="ContactName" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="ContactTitle" [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 ="Address" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="City" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="PostalCode" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Country" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Fax" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-row-island [height ]="null" [key ]="'Orders'" [autoGenerate ]="false" [moving ]="true" >
<igx-column-group header ="Order Information" >
<igx-column-group header ="Order Details" [headerTemplate ]="columnGroupTemplate" >
<igx-column field ="OrderID" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="EmployeeID" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="OrderDate" [sortable ]="true" [resizable ]="true" [dataType ]="'date'" > </igx-column >
<igx-column field ="RequiredDate" [sortable ]="true" [resizable ]="true" [dataType ]="'date'" > </igx-column >
</igx-column-group >
<igx-column-group header ="General Shipping Information" [headerTemplate ]="columnGroupTemplate" >
<igx-column field ="ShippedDate" [sortable ]="true" [resizable ]="true" [dataType ]="'date'" > </igx-column >
<igx-column field ="ShipVia" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Freight" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="ShipName" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
<igx-column-group header ="Shipping Location" [headerTemplate ]="columnGroupTemplate" >
<igx-column field ="ShipAddress" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="ShipCity" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="ShipPostalCode" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="ShipCountry" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-row-island [height ]="null" [key ]="'OrderDetails'" [autoGenerate ]="false" >
<igx-column field ="ProductID" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="UnitPrice" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Quantity" [sortable ]="true" [resizable ]="true" > </igx-column >
<igx-column field ="Discount" [sortable ]="true" [resizable ]="true" > </igx-column >
</igx-row-island >
</igx-row-island >
</igx-hierarchical-grid >
</div >
html コピー .grid__wrapper {
margin : 16px ;
}
.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 { IgxHierarchicalGridModule } from "igniteui-angular" ;
import { HGridMultiHeadersStylingComponent } from "./hierarchical-grid/hierarchical-grid-multi-column-headers-styling/hierarchical-grid-multi-column-styling.component" ;
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive" ;
@NgModule ({
bootstrap : [AppComponent],
declarations : [
AppComponent,
HGridMultiHeadersStylingComponent
],
imports : [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule
],
providers : [],
entryComponents : [],
schemas : []
})
export class AppModule {}
ts コピー import { Component, OnInit } from '@angular/core' ;
import { CUSTOMERS } from '../../data/hierarchical-data' ;
@Component ({
selector : 'app-hierarchical-grid-multi-column-styling' ,
styleUrls : ['./hierarchical-grid-multi-column-styling.component.scss' ],
templateUrl : 'hierarchical-grid-multi-column-styling.component.html'
})
export class HGridMultiHeadersStylingComponent implements OnInit {
public localdata;
constructor ( ) {
}
public ngOnInit(): void {
this .localdata = CUSTOMERS;
}
}
ts コピー <div class ="grid__wrapper" >
<igx-hierarchical-grid [igxPreventDocumentScroll ]="true" #hierarchicalGrid [data ]="localdata" [height ]="'470px'" [width ]="'100%'" displayDensity ="compact" >
<igx-column field ="CustomerID" > </igx-column >
<igx-column-group header ="General Information" >
<igx-column field ="CompanyName" > </igx-column >
<igx-column-group header ="Personal Details" >
<igx-column field ="ContactName" > </igx-column >
<igx-column field ="ContactTitle" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-column-group header ="Address Information" >
<igx-column-group header ="Location" >
<igx-column field ="Address" > </igx-column >
<igx-column field ="City" > </igx-column >
<igx-column field ="PostalCode" > </igx-column >
<igx-column field ="Country" > </igx-column >
</igx-column-group >
<igx-column-group header ="Contact Information" >
<igx-column field ="Phone" > </igx-column >
<igx-column field ="Fax" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-row-island [height ]="null" [key ]="'Orders'" [autoGenerate ]="false" >
<igx-column-group header ="Order Information" >
<igx-column-group header ="Order Details" >
<igx-column field ="OrderID" > </igx-column >
<igx-column field ="EmployeeID" > </igx-column >
<igx-column field ="OrderDate" [dataType ]="'date'" > </igx-column >
<igx-column field ="RequiredDate" [dataType ]="'date'" > </igx-column >
</igx-column-group >
<igx-column-group header ="General Shipping Information" >
<igx-column field ="ShippedDate" [dataType ]="'date'" > </igx-column >
<igx-column field ="ShipVia" > </igx-column >
<igx-column field ="Freight" > </igx-column >
<igx-column field ="ShipName" > </igx-column >
</igx-column-group >
<igx-column-group header ="Shipping Location" >
<igx-column field ="ShipAddress" > </igx-column >
<igx-column field ="ShipCity" > </igx-column >
<igx-column field ="ShipPostalCode" > </igx-column >
<igx-column field ="ShipCountry" > </igx-column >
</igx-column-group >
</igx-column-group >
<igx-row-island [height ]="null" [key ]="'OrderDetails'" [autoGenerate ]="false" >
<igx-column field ="ProductID" > </igx-column >
<igx-column field ="UnitPrice" > </igx-column >
<igx-column field ="Quantity" > </igx-column >
<igx-column field ="Discount" > </igx-column >
</igx-row-island >
</igx-row-island >
</igx-hierarchical-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 {
padding : 16px ;
}
scss コピー
このサンプルは、Change Theme
(テーマの変更) から選択したグローバル テーマに影響を受けません。
API リファレンス
その他のリソース
コミュニティに参加して新しいアイデアをご提案ください。