Angular Hierarchical Grid 行ピン固定
単一または複数の行を Angular UI グリッドの上側または下側にピン固定できます。Ignite UI for Angular の行ピン固定 を使用すると、エンドユーザーは特定の順序で行をピン固定し、Hierarchical Grid を垂直にスクロールしても常に表示される特別な領域に行を複製できます。Material UI Grid には組み込みの行ピン固定 UI が含まれており、Hierarchical Grid のコンテキストで igxActionStrip
コンポーネントを初期化することで有効になります。その他、カスタム UI を定義し、行のピン固定 API を介して行のピン固定状態を変更できます。
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 { HGridRowPinningSampleComponent } from "./hierarchical-grid/hierarchical-grid-row-pinning/hierarchical-grid-row-pinning.component" ;
import {
IgxHierarchicalGridModule,
IgxActionStripModule,
IgxSwitchModule
} from "igniteui-angular" ;
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive" ;
@NgModule ({
bootstrap : [AppComponent],
declarations : [
AppComponent,
HGridRowPinningSampleComponent
],
imports : [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxActionStripModule,
IgxHierarchicalGridModule,
IgxSwitchModule
],
providers : [],
entryComponents : [],
schemas : []
})
export class AppModule {}
ts コピー import { Component, OnInit, ViewChild } from '@angular/core' ;
import {
ColumnPinningPosition,
IgxHierarchicalGridComponent,
IPinningConfig,
RowPinningPosition
} from 'igniteui-angular' ;
import { SINGERS } from '../../data/singersData' ;
@Component ({
selector : 'app-hierarchical-grid-row-pinning' ,
styleUrls : ['./hierarchical-grid-row-pinning.component.scss' ],
templateUrl : 'hierarchical-grid-row-pinning.component.html'
})
export class HGridRowPinningSampleComponent implements OnInit {
@ViewChild ('hierarchicalGrid1' , { static : true })
public hierarchicalGrid: IgxHierarchicalGridComponent;
public localData;
public pinningConfig: IPinningConfig = { rows : RowPinningPosition.Top, columns : ColumnPinningPosition.End };
constructor ( ) {
this .localData = SINGERS;
}
public formatter = (a ) => a;
public ngOnInit ( ) {
this .hierarchicalGrid.pinRow(SINGERS[0 ].Photo);
this .hierarchicalGrid.pinRow(SINGERS[3 ].Photo);
}
public changePinningPosition ( ) {
if (this .pinningConfig.rows === RowPinningPosition.Bottom) {
this .pinningConfig = { columns : this .pinningConfig.columns, rows : RowPinningPosition.Top };
} else {
this .pinningConfig = { columns : this .pinningConfig.columns, rows : RowPinningPosition.Bottom };
}
}
}
ts コピー <div class ="switches" >
<igx-switch (change )='changePinningPosition()' style ="padding-left: 20px" > Bottom Row Pinning toggle</igx-switch >
</div >
<div class ="grid-container" >
<igx-hierarchical-grid [igxPreventDocumentScroll ]="true" #hierarchicalGrid1 [data ]="localData" [primaryKey ]="'Photo'"
[autoGenerate ]="false" [height ]="'520px'" [width ]="'100%'" [rowHeight ]="'65px'" [pinning ]='pinningConfig'
[cellSelection ]="'none'" (dataPreLoad )="actionStrip1.hide()" >
<igx-column field ="Artist" > </igx-column >
<igx-column field ="Photo" [editable ]="false" >
<ng-template igxCell let-cell ="cell" >
<div class ="cell__inner_2" >
<img [src ]="cell.value" class ="photo" />
</div >
</ng-template >
</igx-column >
<igx-column field ="Debut" dataType ="number" [formatter ]="formatter" > </igx-column >
<igx-column field ="GrammyNominations" header ="Grammy Nominations" dataType ="number" > </igx-column >
<igx-column field ="GrammyAwards" header ="Grammy Awards" dataType ="number" > </igx-column >
<igx-action-strip #actionStrip1 >
<igx-grid-pinning-actions > </igx-grid-pinning-actions >
</igx-action-strip >
<igx-row-island [height ]="null" [key ]="'Albums'" [autoGenerate ]="false" [primaryKey ]="'Album'" [pinning ]='pinningConfig'
[cellSelection ]="'none'" (onDataPreLoad )="actionStrip2.hide()" >
<igx-column field ="Album" > </igx-column >
<igx-column field ="LaunchDate" header ="Launch Date" [dataType ]="'date'" > </igx-column >
<igx-column field ="BillboardReview" header ="Billboard Review" > </igx-column >
<igx-column field ="USBillboard200" header ="US Billboard 200" > </igx-column >
<igx-action-strip #actionStrip2 >
<igx-grid-pinning-actions > </igx-grid-pinning-actions >
</igx-action-strip >
</igx-row-island >
</igx-hierarchical-grid >
</div >
html コピー .grid-container {
display : flex;
padding : 20px ;
}
.switches {
margin-top : 24px ;
}
scss コピー
このサンプルが気に入りましたか? 完全な Ignite UI for Angularツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。
行のピン固定 UI
組み込みの行ピン固定 UI は、GridPinningActions
コンポーネントと igxActionStrip
コンポーネントを追加することで有効になります。アクション ストリップは、行を方法すると自動的に表示され、表示される行の状態に基づいてピンまたはピン固定解除ボタンのアイコンを表示します。ピン固定された行のコピーをビューにスクロールする追加のアクションがピン固定された行ごとに表示されます。
<igx-hierarchical-grid [data ]="data" [autoGenerate ]="false" >
<igx-column *ngFor ="let c of columns" [field ]="c.field" [header ]="c.field" >
</igx-column >
<igx-action-strip #actionStrip >
<igx-grid-pinning-actions > </igx-grid-pinning-actions >
<igx-grid-editing-actions > </igx-grid-editing-actions >
</igx-action-strip >
</igx-hierarchical-grid >
html
行のピン固定 API
行のピン固定は、row
の pinned
設定によって制御されます。デフォルトでピン固定行は Hierarchical Grid の上側に固定して描画され、Hierarchical Grid 本体のピン固定されていない行は垂直スクロールされます。
this .hierarchicalGrid.getRowByIndex(0 ).pinned = true ;
typescript
IgxHierarchicalGridComponent
の pinRow
または unpinRow
メソッドを使用して ID によってレコードをピン固定またはピン固定解除できます。
this .hierarchicalGrid.pinRow('ALFKI' );
this .hierarchicalGrid.unpinRow('ALFKI' );
typescript
注: 行の ID は、グリッドの primaryKey
またはレコード インスタンス自体によって定義される主キー値です。両方のメソッドは操作に成功したかどうかを示すブール値を返します。よくある失敗の原因に行がすでにその状態になっていることがあります。
行は、最後にピンされた行の下にピン固定されます。ピン固定行の順序を変更するには、rowPinning
イベントにサブスクライブして insertAtIndex
プロパティを適切な位置インデックスに変更します。
<igx-hierarchical-grid class ="hgrid" [data ]="localdata" [autoGenerate ]="true" (rowPinning )="rowPinning($event)" >
</igx-hierarchical-grid >
html
public rowPinning (event ) {
event.insertAtIndex = 0 ;
}
typescript
ピン固定の位置
pinning
設定オプションを使用して、行のピン固定の位置を変更できます。ピン固定の位置を Top または Bottom のいずれかに設定できます。
Bottom に設定すると、行がピン固定されていない行の後に、グリッドの一番下にレンダリングされます。ピン固定されていない行は垂直にスクロールできますが、ピン固定された行は下側に固定されます。
<igx-hierarchical-grid [data ]="data" [autoGenerate ]="true" [pinning ]="pinningConfig" > </igx-hierarchical-grid >
html
public pinningConfig: IPinningConfig = { rows : RowPinningPosition.Bottom };
typescript
カスタム行ピン固定 UI
カスタム UI を定義し、関連する API を介して行のピン状態を変更できます。
アイコン付きの追加の列によるカスタム行ピン固定 UI
アクション ストリップの代わりに、すべての行にピンのアイコンを表示し、エンドユーザーが特定の行のピン状態をクリックして変更できます。
カスタム アイコンを含むセル テンプレートの列を追加することで実行できます。
<igx-hierarchical-grid [data ]="localdata" [autoGenerate ]="false" >
<igx-column width ='70px' [filterable ]='false' >
<ng-template igxCell let-cell ="cell" let-val >
<igx-icon class ="pin-icon" (mousedown )="togglePinning(cell.row, $event)" >
{{cell.row.pinned ? 'lock' : 'lock_open'}}
</igx-icon >
</ng-template >
</igx-column >
<igx-column *ngFor ="let c of columns" [field ]="c.field" [header ]="c.field" >
</igx-column >
<igx-row-island [key ]="'Orders'" [autoGenerate ]="true" >
</igx-row-island >
</igx-hierarchical-grid >
html
カスタムアイコンをクリックすると、関連する行のピン状態は、行の API メソッドを使用して変更できます。
public togglePinning (row: IgxGridRow, event ) {
event.preventDefault();
if (row.pinned) {
row.unpin();
} else {
row.pin();
}
}
typescript
デモ
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 { HGridRowPinningExtraColumnSampleComponent } from "./hierarchical-grid/hierarchical-grid-row-pinning-extra-column/hierarchical-grid-row-pinning-extra-column.component" ;
import {
IgxHierarchicalGridModule,
IgxIconModule,
IgxSwitchModule
} from "igniteui-angular" ;
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive" ;
@NgModule ({
bootstrap : [AppComponent],
declarations : [
AppComponent,
HGridRowPinningExtraColumnSampleComponent
],
imports : [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule,
IgxIconModule,
IgxSwitchModule
],
providers : [],
entryComponents : [],
schemas : []
})
export class AppModule {}
ts コピー import { Component, AfterViewInit } from '@angular/core' ;
import {
ColumnPinningPosition,
IgxIconService,
RowType,
IPinningConfig,
RowPinningPosition
} from 'igniteui-angular' ;
import { icons } from '../../services/svgIcons' ;
import { SINGERS } from '../../data/singersData' ;
const FILTERING_ICONS_FONT_SET = 'filtering-icons' ;
@Component ({
selector : 'app-hierarchical-grid-row-pinning-extra-column' ,
styleUrls : ['./hierarchical-grid-row-pinning-extra-column.component.scss' ],
templateUrl : 'hierarchical-grid-row-pinning-extra-column.component.html'
})
export class HGridRowPinningExtraColumnSampleComponent implements AfterViewInit {
public localData;
public pinningConfig: IPinningConfig = { rows : RowPinningPosition.Top, columns : ColumnPinningPosition.End };
constructor (private iconService: IgxIconService ) {
this .localData = SINGERS;
}
public ngAfterViewInit ( ) {
const pinnedIcons = icons.filter(icon => icon.name === 'pin' || icon.name === 'unpin' );
pinnedIcons.forEach(icon => {
if (!this .iconService.isSvgIconCached(icon.name, FILTERING_ICONS_FONT_SET)) {
this .iconService.addSvgIconFromText(icon.name, icon.value, FILTERING_ICONS_FONT_SET);
}
});
}
public togglePinning (row: RowType, event ) {
event.preventDefault();
if (row.pinned) {
row.unpin();
} else {
row.pin();
}
}
public changePinningPosition ( ) {
if (this .pinningConfig.rows === RowPinningPosition.Bottom) {
this .pinningConfig = { columns : this .pinningConfig.columns, rows : RowPinningPosition.Top };
} else {
this .pinningConfig = { columns : this .pinningConfig.columns, rows : RowPinningPosition.Bottom };
}
}
public formatter = (a ) => a;
}
ts コピー <div class ="switches" >
<igx-switch (change )='changePinningPosition()' style ="padding-left: 20px" > Bottom Row Pinning toggle</igx-switch >
</div >
<div class ="grid-container" >
<igx-hierarchical-grid [igxPreventDocumentScroll ]="true" #hierarchicalGrid [data ]="localData" [primaryKey ]="'Photo'" [autoGenerate ]="false"
[height ]="'520px'" [width ]="'100%'" [rowHeight ]="'65px'" [pinning ]='pinningConfig' [cellSelection ]="'none'" >
<igx-column width ='70px' [filterable ]='false' [pinned ]="true" >
<ng-template igxCell let-cell ="cell" let-val >
<igx-icon class ="pin-icon" family ="filtering-icons" name ="{{cell.row.pinned ? 'unpin' : 'pin'}}"
(mouseup )="togglePinning(cell.row, $event)" >
</igx-icon >
</ng-template >
</igx-column >
<igx-column field ="Artist" > </igx-column >
<igx-column field ="Photo" [editable ]="false" >
<ng-template igxCell let-cell ="cell" >
<div class ="cell__inner_2" >
<img [src ]="cell.value" class ="photo" />
</div >
</ng-template >
</igx-column >
<igx-column field ="Debut" dataType ="number" [formatter ]="formatter" > </igx-column >
<igx-column field ="GrammyNominations" header ="Grammy Nominations" dataType ="number" > </igx-column >
<igx-column field ="GrammyAwards" header ="Grammy Awards" dataType ="number" > </igx-column >
<igx-row-island [height ]="null" [key ]="'Albums'" [autoGenerate ]="false" [primaryKey ]="'Album'" [pinning ]='pinningConfig'
[cellSelection ]="'none'" >
<igx-column width ='70px' [filterable ]='false' [pinned ]="true" >
<ng-template igxCell let-cell ="cell" let-val >
<igx-icon class ="pin-icon" family ="filtering-icons" name ="{{cell.row.pinned ? 'unpin' : 'pin'}}"
(mouseup )="togglePinning(cell.row, $event)" >
</igx-icon >
</ng-template >
</igx-column >
<igx-column field ="Album" > </igx-column >
<igx-column field ="LaunchDate" header ="Launch Date" [dataType ]="'date'" > </igx-column >
<igx-column field ="BillboardReview" header ="Billboard Review" > </igx-column >
<igx-column field ="USBillboard200" header ="US Billboard 200" > </igx-column >
<igx-row-island [height ]="null" [key ]="'Songs'" [autoGenerate ]="false" [primaryKey ]="'Number'" [pinning ]='pinningConfig'
[cellSelection ]="'none'" >
<igx-column width ='70px' [filterable ]='false' [pinned ]="true" >
<ng-template igxCell let-cell ="cell" let-val >
<igx-icon class ="pin-icon" family ="filtering-icons"
name ="{{cell.row.pinned ? 'unpin' : 'pin'}}" (mouseup )="togglePinning(cell.row, $event)" >
</igx-icon >
</ng-template >
</igx-column >
<igx-column field ="Number" header ="No." > </igx-column >
<igx-column field ="Title" > </igx-column >
<igx-column field ="Released" dataType ="date" > </igx-column >
<igx-column field ="Genre" > </igx-column >
</igx-row-island >
</igx-row-island >
<igx-row-island [height ]="null" [key ]="'Tours'" [autoGenerate ]="false" [primaryKey ]="'Tour'" [pinning ]='pinningConfig'
[cellSelection ]="'none'" >
<igx-column width ='70px' [filterable ]='false' [pinned ]="true" >
<ng-template igxCell let-cell ="cell" let-val >
<igx-icon class ="pin-icon" family ="filtering-icons" name ="{{cell.row.pinned ? 'unpin' : 'pin'}}"
(mouseup )="togglePinning(cell.row, $event)" >
</igx-icon >
</ng-template >
</igx-column >
<igx-column field ="Tour" > </igx-column >
<igx-column field ="StartedOn" header ="Started on" > </igx-column >
<igx-column field ="Location" > </igx-column >
<igx-column field ="Headliner" > </igx-column >
</igx-row-island >
</igx-hierarchical-grid >
</div >
html コピー .grid-container {
display : flex;
padding : 16px ;
}
.pin-icon {
cursor : pointer;
color : #999 ;
}
.pin-icon :hover {
color : #444
}
.switches {
margin-top: 24px ;
}
scss コピー
行ピン固定の制限
データソースに存在するレコードのみをピン固定できます。
行のピン固定状態は Excel にエクスポートされません。グリッドは行のピン固定が適用されずにエクスポートされます。
ピン固定行が内部でグリッドのピン固定領域と非固定領域の両方に存在するよう保存される仕様上、グリッド内のレコードがオンデマンドでリモート エンドポイントから取得される場合 (リモート仮想化)、行のピン固定はサポートされません。
グリッドのスクロール可能領域におけるピン固定行のコピーは、ピン固定行が存在する状態で他のグリッド機能が動作するのに不可欠な役割を果たします。そのため、その生成を無効化または削除することはできません。
行選択 は 行 ID のみで動作するため、ピン固定行を選択するとそのコピーも選択されます (逆も同様)。さらに、ピン固定領域での範囲選択 (Shift + クリックにより) は、スクロール可能な領域で行を範囲選択する場合と同じように機能します。結果として、間にある行はピン固定されていなくてもすべて選択されます。API を 介して選択した行を取得すると、選択した各レコードの単一のインスタンスのみを返します。
グリッドに primaryKey
が設定されておらず、リモート データ シナリオが有効になっている場合 (ページング、ソート、フィルタリング、スクロール時に、グリッドに表示されるデータを取得するためのリモート サーバーへのリクエストがトリガーされる場合)、データ要求が完了すると、行は次の状態を失います:
Row Selection
Row Expand/collapse
Row Editing
Row Pinning
スタイル設定
IgxHierarchicalGrid は、Ignite UI for Angular テーマ ライブラリ
でスタイルを設定できます。Hierarchical Grid の grid-theme
は、Hierarchical Grid のすべての機能をカスタマイズできるさまざまなプロパティを公開します。
以下では、Hierarchical Grid の行ピン固定スタイルをカスタマイズする手順を示します。
スタイル ライブラリのインポート
行ピン固定機能をカスタマイズするには、まずすべてのスタイリング機能とミックスインが配置されている index
ファイルをインポートする必要があります。
@use "igniteui-angular/theming" as *;
scss
テーマの定義
次に、grid-theme
を拡張し、必要に応じて行のピン固定機能のカスタマイズに必要なパラメーターを受け入れる新しいテーマを作成します。
$custom-grid-theme : grid-theme(
$pinned-border-width : 5px ,
$pinned-border-style : double,
$pinned-border-color : #ffcd0f ,
$cell-active-border-color : #ffcd0f
);
scss
CSS 変数の使用
最後にカスタム グリッド テーマを設定します。
@include css-vars($custom-grid-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 { HGridRowPinningStylingSampleComponent } from "./hierarchical-grid/hierarchical-grid-row-pinning-styling/hierarchical-grid-row-pinning-styling.component" ;
import {
IgxHierarchicalGridModule,
IgxActionStripModule
} from "igniteui-angular" ;
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive" ;
@NgModule ({
bootstrap : [AppComponent],
declarations : [
AppComponent,
HGridRowPinningStylingSampleComponent
],
imports : [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxActionStripModule,
IgxHierarchicalGridModule
],
providers : [],
entryComponents : [],
schemas : []
})
export class AppModule {}
ts コピー import { Component, OnInit, ViewChild } from '@angular/core' ;
import {
ColumnPinningPosition,
IgxHierarchicalGridComponent,
IPinningConfig,
RowPinningPosition
} from 'igniteui-angular' ;
import { SINGERS } from '../../data/singersData' ;
@Component ({
selector : 'app-hierarchical-grid-row-pinning-styling' ,
styleUrls : ['./hierarchical-grid-row-pinning-styling.component.scss' ],
templateUrl : 'hierarchical-grid-row-pinning-styling.component.html'
})
export class HGridRowPinningStylingSampleComponent implements OnInit {
@ViewChild ('hierarchicalGrid1' , { static : true })
public hierarchicalGrid: IgxHierarchicalGridComponent;
public localData;
public pinningConfig: IPinningConfig = { rows : RowPinningPosition.Top, columns : ColumnPinningPosition.End };
constructor ( ) {
this .localData = SINGERS;
}
public formatter = (a ) => a;
public ngOnInit ( ) {
this .hierarchicalGrid.pinRow(SINGERS[0 ].Photo);
this .hierarchicalGrid.pinRow(SINGERS[3 ].Photo);
}
public changePinningPosition ( ) {
if (this .pinningConfig.rows === RowPinningPosition.Bottom) {
this .pinningConfig = { columns : this .pinningConfig.columns, rows : RowPinningPosition.Top };
} else {
this .pinningConfig = { columns : this .pinningConfig.columns, rows : RowPinningPosition.Bottom };
}
}
}
ts コピー <div class ="grid-container" >
<igx-hierarchical-grid [igxPreventDocumentScroll ]="true" #hierarchicalGrid1 [data ]="localData" [primaryKey ]="'Photo'"
[autoGenerate ]="false" [height ]="'520px'" [width ]="'100%'" [rowHeight ]="'65px'" [pinning ]='pinningConfig'
[cellSelection ]="'none'" (dataPreLoad )="actionStrip1.hide()" >
<igx-column field ="Artist" > </igx-column >
<igx-column field ="Photo" [editable ]="false" >
<ng-template igxCell let-cell ="cell" >
<div class ="cell__inner_2" >
<img [src ]="cell.value" class ="photo" />
</div >
</ng-template >
</igx-column >
<igx-column field ="Debut" dataType ="number" [formatter ]="formatter" > </igx-column >
<igx-column field ="GrammyNominations" header ="Grammy Nominations" dataType ="number" > </igx-column >
<igx-column field ="GrammyAwards" header ="Grammy Awards" dataType ="number" > </igx-column >
<igx-action-strip #actionStrip1 >
<igx-grid-pinning-actions > </igx-grid-pinning-actions >
</igx-action-strip >
<igx-row-island [height ]="null" [key ]="'Albums'" [autoGenerate ]="false" [primaryKey ]="'Album'" [pinning ]='pinningConfig'
[cellSelection ]="'none'" (onDataPreLoad )="actionStrip2.hide()" >
<igx-column field ="Album" > </igx-column >
<igx-column field ="LaunchDate" header ="Launch Date" [dataType ]="'date'" > </igx-column >
<igx-column field ="BillboardReview" header ="Billboard Review" > </igx-column >
<igx-column field ="USBillboard200" header ="US Billboard 200" > </igx-column >
<igx-action-strip #actionStrip2 >
<igx-grid-pinning-actions > </igx-grid-pinning-actions >
</igx-action-strip >
</igx-row-island >
</igx-hierarchical-grid >
</div >
html コピー @use '../../../variables' as *;
$custom-theme : grid-theme(
$pinned-border-width : 5px ,
$pinned-border-style : double,
$pinned-border-color : #FFCD0F ,
$cell-active-border-color : #FFCD0F
);
:host ::ng-deep {
@include css-vars($custom-theme );
}
.grid-container {
display : flex;
padding : 16px ;
}
scss コピー
このサンプルは、Change Theme
(テーマの変更) から選択したグローバル テーマに影響を受けません。
API リファレンス
その他のリソース
コミュニティに参加して新しいアイデアをご提案ください。