Angular セル結合
Ignite UI for Angular の Grid には、同じ値を持つ隣接セルを 1 つの大きなセルに結合するセル結合機能があります。結合は列内で縦方向に適用され、重複する値を減らして可読性を向上させます。既定ではデータ値の一致でセル結合されるほか、カスタム条件を設定して結合するように構成できます。
Angular セル結合の例
セル結合の有効化と使用
グリッドでのセル結合は、以下の 2 つのレベルで制御されます:
- グリッド レベルの結合モード - 結合がいつ適用されるかを決定
- 列レベルの結合トグル - どの列でセルを結合できるかを決定
グリッド結合モード
グリッドは、GridCellMergeMode
列挙型の値を受け入れる cellMergeMode
プロパティを公開します。
always
- ソート状態に関係なく、結合条件を満たすすべての隣接セルを結合。onSort
- 列がソートされているときのみ隣接セルを結合 (デフォルト値)。
<igx-grid [data]="data" [cellMergeMode]="cellMergeMode">
...
</igx-grid>
protected cellMergeMode: GridCellMergeMode = 'always';
列結合のトグル
列レベルでは、merge
プロパティで結合の有効または無効を切り替えます。
<igx-column field="OrderID" [merge]="true"></igx-column>
<igx-column field="ShipperName" [merge]="false"></igx-column>
上記の例では:
- OrderID 列は、隣接する重複値を結合します。
- ShipperName 列は、結合を行わず通常通りに描画されます。
組み合わせた例
<igx-grid [data]="data" [cellMergeMode]="cellMergeMode" [autoGenerate]="false">
<igx-column field="OrderID" header="Order ID" [merge]="true"></igx-column>
<igx-column field="ShipperName" header="Shipper Name" [merge]="true"></igx-column>
<igx-column field="Salesperson" header="Salesperson"></igx-column>
</igx-grid>
protected cellMergeMode: GridCellMergeMode = 'onSort';
この例では、グリッドは列がソートされている場合のみ結合を行い、Category 列と Product 列の両方で結合が有効になっています。
カスタム結合条件
always
と onSort
の組み込みモードに加えて、mergeStrategy
プロパティを使用して独自の結合条件を定義することができます。このストラテジでは、セルの比較方法と結合範囲の計算方法の両方を制御します。
結合ストラテジ インターフェイス
カスタム結合ストラテジは IGridMergeStrategy
インターフェイスを実装する必要があります:
export interface IGridMergeStrategy {
merge: (
data: any[],
field: string,
comparer: (prevRecord: any, currentRecord: any, field: string) => boolean,
result: any[],
activeRowIndex?: number,
grid?: GridType
) => any[];
comparer: (prevRecord: any, record: any, field: string) => boolean;
}
merge
- 結合されたセルをどのように生成するかを定義。comparer
- 隣接するレコードを結合すべきかを判定する条件を定義。
デフォルトのストラテジを拡張
一部の動作 (例: comparer ロジック) のみをカスタマイズしたい場合は、組み込みの DefaultMergeStrategy
を拡張し、必要なメソッドのみをオーバーライドできます。
export class MyCustomStrategy extends DefaultMergeStrategy {
/* Merge only cells within their respective projects */
public override comparer(prevRecord: any, record: any, field: string): boolean {
const a = prevRecord[field];
const b = record[field];
const projA = prevRecord['ProjectName'];
const projB = record['ProjectName'];
return a === b && projA === projB;
}
}
カスタム ストラテジの適用
定義したカスタム ストラテジは、mergeStrategy
プロパティを通じてグリッドに割り当てます。
<igx-grid [data]="data" [mergeStrategy]="customStrategy">
<igx-column field="ActionID" [merge]="true"></igx-column>
<igx-column field="ProjectName" [merge]="true"></igx-column>
</igx-grid>
protected customStrategy = new MyCustomStrategy();
デモ
機能の統合
セル結合の特性上、他の機能との連携動作について以下の点に注意が必要です:
展開と縮小: マスター詳細、グループ化など、データ以外の行を生成する機能がある場合、その位置でセル結合が中断され、グループが分割されます。
Excel エクスポート: 結合されたセルは、Excel にエクスポートしても結合状態が維持されます。
列のピン固定: 列がピン固定されてもセルの結合は維持され、ピン固定領域内に表示されます。
行のピン固定: セルは自身が属する領域内でのみ結合されます。つまり、ピン固定された行のセルはピン固定行のセル同士で、ピン固定されていない行のセルはその中でのみ結合されます。
ナビゲーション/アクティベーション: セルがアクティブになると、その行内の結合セルはすべて単一セルに分解されます。これはキーボード ナビゲーションによるアクティベーションも含みます。
Note
結合セルをクリックすると、結合シーケンス内でもっとも近いセルがアクティブになります。
- 更新/編集: アクティブ化によって結合シーケンスが分解されるため、編集モードになるのは単一セルのみです。
- 行の選択: 選択された行が結合セルと交差する場合、関連するすべての結合セルが選択対象としてマークされます。
制限
既知の制限 | 説明 |
---|---|
セルの結合は、複数行レイアウトとの組み合わせではサポートされません。 | 両方とも複雑なレイアウトを使用するため、同時に使用することはできません。このような無効な構成が検出された場合は警告が表示されます。 |