Angular Grid のセル編集

    Ignite UI for Angular Grid コンポーネントは、Angular CRUD 操作のための優れたデータ操作機能と強力な API を提供します。デフォルトで Grid はセル編集を使用し、デフォルトのセル編集テンプレートによって、列のデータ型に基づいてさまざまなエディターが表示されます。さらに、データ更新アクション用の独自のカスタム テンプレートを定義したり、変更をコミット/破棄したりするためのデフォルトの動作をオーバーライドすることもできます。

    Angular Grid セル編集とセル テンプレートの例

    EXAMPLE
    MODULES
    TS
    HTML
    SCSS

    このサンプルが気に入りましたか? 完全な Ignite UI for Angularツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。

    任意のタイプのエディター コンポーネントで igxCellEditor を使用すると、キーボード ナビゲーション フローが中断されます。同じことが、編集モードに入るカスタム セルの直接編集にも当てはまります。これは、追加したエディター コンポーネント (igxSelectigxCombo など) ではなく、セル要素にフォーカスが残るためです。これが、igxFocus ディレクティブを利用する必要がある理由です。これにより、フォーカスがセル内コンポーネントに直接移動し、セル/行の流暢な編集フローが維持されます。

    セルの編集

    UI を介した編集

    編集可能なセルがフォーカスされたときに以下のいずれかの方法で特定のセルを編集モードにすることができます。

    • ダブルクリック;
    • シングル クリック - 以前選択したセルが編集モードで現在選択したセルが編集可能な場合のみ、シングル クリックで編集モードに入ります。以前選択したセルが編集モードではない場合、編集モードに入らずにシングル クリックでセルを選択します。
    • Enter キーの押下;
    • F2 キーの押下;

    変更をコミットしない場合も以下の方法で編集モードを終了できます。

    • Escape キーの押下;
    • ソートフィルターリング検索非表示 操作の実行時。

    変更をコミットしない場合も以下の方法で編集モードを終了できます。

    • Enter キーの押下;
    • F2 キーの押下;
    • Tab キーの押下;
    • 他のセルをシングル クリック - Grid で他のセルをクリックしたときに変更がサブミットされます。
    • その他の操作 (ページング、サイズ変更、ピン固定、移動など) は、編集モードを終了して変更を送信します。

    セルは、垂直/水平方向へのスクロールや Grid 以外をクリックした場合も編集モードのままです。セル編集と行編集両方で有効です。

    API を介した編集

    プライマリキーが定義されている場合のみ IgxGrid API でもセル値を変更することができます。

    public updateCell() {
        this.grid1.updateCell(newValue, rowID, 'ReorderLevel');
    }
    typescript

    セルを更新するその他の方法として IgxGridCellupdate メソッドで直接更新する方法があります。

    public updateCell() {
        const cell = this.grid1.getCellByColumn(rowIndex, 'ReorderLevel');
        // You can also get cell by rowID if primary key is defined
        // cell = this.grid1.getCellByKey(rowID, 'ReorderLevel');
        cell.update(70);
    }
    typescript

    セル編集テンプレート

    デフォルトのセル編集テンプレートの詳細については、編集トピックを参照してください。

    セルが編集モードのときに適用されるカスタム テンプレートを提供する場合は、igxCellEditor ディレクティブを使用できます。これを行うには、igxCellEditor ディレクティブでマークされた ng-template を渡し、カスタム コントロールを cell.editValue に適切にバインドする必要があります:

    <igx-column field="class" header="Class" [editable]="true">
        <ng-template igxCellEditor let-cell="cell" let-value>
            <igx-select class="cell-select" [(ngModel)]="cell.editValue" [igxFocus]="true">
                <igx-select-item *ngFor="let class of classes" [value]="class">
                    {{ class }}
                </igx-select-item>
            </igx-select>
        </ng-template>
    </igx-column>
    html

    このコードは、RaceClass、および Alignment 列のセルに IgxSelectComponent を実装する以下のサンプルで使用されています。

    EXAMPLE
    MODULES
    TS
    HTML
    SCSS

    編集モードでセルの editValue に加えられた変更は、終了時に適切な編集イベントをトリガーし、トランザクション状態に適用されます (トランザクションが有効な場合)。

    セルテンプレート igxCell は、編集モード外での列のセルの表示方法を制御します。 igxCellEditor セル編集テンプレート ディレクティブは、編集モードでの列のセルの表示方法を処理し、編集されたセルの編集値を制御します。

    任意のタイプのエディター コンポーネントで igxCellEditor を使用すると、キーボード ナビゲーション フローが中断されます。同じことが、編集モードに入るカスタム セルの直接編集にも当てはまります。これは、追加したエディター コンポーネント (igxSelectigxCombo など) ではなく、セル要素にフォーカスが残るためです。これが、igxFocus ディレクティブを利用する必要がある理由です。これにより、フォーカスがセル内コンポーネントに直接移動し、セル/行の 流暢な編集フローが維持されます。

    列とそのテンプレートの構成方法の詳細については、グリッド列構成のドキュメントを参照してください。

    Grid Excel スタイル編集

    Excel スタイル編集を使用すると、Excel を使用する場合と同じようにセルをナビゲートし、すばやく編集できます。

    このカスタム機能を実装するには、グリッドのイベントを使用します。最初にグリッドの keydown イベントにフックし、そこから 2 つの機能を実装できます。

    • 常時編集モード
    public keydownHandler(event) {
      const key = event.keyCode;
      const grid = this.grid;
      const activeElem = grid.navigation.activeNode;
    
      if(
        (key >= 48 && key <= 57) ||
        (key >= 65 && key <= 90) ||
        (key >= 97 && key <= 122)){
            // Number or Alphabet upper case or Alphabet lower case
            const columnName = grid.getColumnByVisibleIndex(activeElem.column).field;
            const cell = grid.getCellByColumn(activeElem.row, columnName);
            if (cell && !cell.editMode) {
                cell.editMode = true;
                cell.editValue = event.key;
                this.shouldAppendValue = true;
            } else if (cell && cell.editMode && this.shouldAppendValue) {
                event.preventDefault();
                cell.editValue = cell.editValue + event.key;
                this.shouldAppendValue = false;
            }
        }
    }
    typescript
    • Enter/Shift + Enter ナビゲーション
    if (key == 13) {
        let thisRow = activeElem.row;
        const column = activeElem.column;
        const rowInfo = grid.dataView;
    
        // to find the next eiligible cell, we will use a custom method that will check the next suitable index
        let nextRow = this.getNextEditableRowIndex(thisRow, rowInfo, event.shiftKey);
    
        // and then we will navigate to it using the grid's built in method navigateTo
        this.grid.navigateTo(nextRow, column, (obj) => {
            obj.target.activate();
            this.grid.clearCellSelection();
            this.cdr.detectChanges();
        });
    }
    typescript

    次の適格なインデックスを見つけるための重要な部分は以下のようになります。

    //first we check if the currently selected cell is the first or the last
    if (currentRowIndex < 0 || (currentRowIndex === 0 && previous) || (currentRowIndex >= dataView.length - 1 && !previous)) {
    return currentRowIndex;
    }
    // in case using shift + enter combination, we look for the first suitable cell going up the field
    if(previous){
    return  dataView.findLastIndex((rec, index) => index < currentRowIndex && this.isEditableDataRecordAtIndex(index, dataView));
    }
    // or for the next one down the field
    return dataView.findIndex((rec, index) => index > currentRowIndex && this.isEditableDataRecordAtIndex(index, dataView));
    typescript

    詳細については、サンプルを参照してください。

    Angular Grid Excel スタイル編集のサンプル

    EXAMPLE
    MODULES
    TS
    HTML
    SCSS

    上記のアプローチの主な利点は次のとおりです:

    • 常時編集モード: セルが選択されているときに入力すると、編集モードに入り、入力された値が既存の値を置き換えます。
    • Enter/Shift + Enter で移動する場合、データ以外の行はスキップされます。これにより、ユーザーは値をすばやく切り替えることができます。

    CRUD 操作

    CRUD 操作を実行した場合、filteringsortinggrouping などのパイプが再適用されるため、ビューが自動的に更新されることに注意してください。

    IgxGridComponent は基本的な CRUD 操作のための簡易な API を提供します。

    新しいレコードの追加

    Grid コンポーネントは、提供したデータをデータ ソースに追加する addRow メソッドを公開します。

    // Adding a new record
    // Assuming we have a `getNewRecord` method returning the new row data.
    const record = this.getNewRecord();
    this.grid.addRow(record);
    typescript

    データを Grid で更新

    Grid のデータ更新は、グリッドでプライマリキーが定義されている場合のみ updateRowupdateCell メソッドで行うことができます。セルと行の値またはそのいずれかを各 update メソッドで直接更新できます。

    // Updating the whole row
    this.grid.updateRow(newData, this.selectedCell.cellID.rowID);
    
    // Just a particular cell through the Grid API
    this.grid.updateCell(newData, this.selectedCell.cellID.rowID, this.selectedCell.column.field);
    
    // Directly using the cell `update` method
    this.selectedCell.update(newData);
    
    // Directly using the row `update` method
    const row = this.grid.getRowByKey(rowID);
    row.update(newData);
    typescript

    Grid からデータを削除

    deleteRow() メソッドは、プライマリキーが定義されている場合に指定した行のみを削除することに注意してください。

    // Delete row through Grid API
    this.grid.deleteRow(this.selectedCell.cellID.rowID);
    // Delete row through row object
    const row = this.grid.getRowByIndex(rowIndex);
    row.delete();
    typescript

    igx-grid に関係なく、ボタンのクリックなどのユーザー インタラクションに関連付けできます。

    <button igxButton igxRipple (click)="deleteRow($event)">Delete Row</button>
    html

    編集イベントでのセル検証

    グリッドの編集イベントを使用して、ユーザーがグリッドを操作する方法を変更できます。 この例では、cellEdit イベントにバインドすることにより、入力されたデータに基づいてセルを検証します。セルの新しい値が事前定義された基準を満たしていない場合、イベントをキャンセルすることでデータソースに到達しないようにします (event.cancel = true)。また、IgxToast を使用してカスタム エラーメッセージを表示します。

    最初に必要なことは、グリッドのイベントにバインドすることです。

    <igx-grid (cellEdit)="handleCellEdit($event)"
    ...>
    ...
    </igx-grid>
    html

    cellEdit は、セルの値がコミットされる直前に発生します。handleCellEdit の定義では、アクションを実行する前に特定の列を確認する必要があります。

    export class MyGridEventsComponent {
        public handleCellEdit(event: IGridEditEventArgs): void {
            const column = event.column;
            if (column.field === 'Ordered') {
                const rowData = event.rowData;
                if (!rowData) {
                    return;
                }
                if (event.newValue > rowData.UnitsInStock) {
                    event.cancel = true;
                    this.toast.open();
                }
            }
        }
    }
    typescript

    注文済み列の下のセルに入力された値が使用可能量 (在庫数の値) よりも大きい場合、編集はキャンセルされ、エラー メッセージ付きのトーストが表示されます。

    以下は、上記の検証が igx-grid に適用された結果のデモです。

    EXAMPLE
    MODULES
    TS
    HTML
    SCSS

    スタイル設定

    IgxGrid で Ignite UI for Angular テーマ ライブラリを使用してセルのスタイルを設定できます。グリッドの grid-theme は、ユーザーがグリッドのさまざまな側面をスタイル設定できる広範なプロパティを公開します。

    以下の手順では、編集モードでグリッドのセルのスタイルを設定する方法と、それらのスタイルの範囲を設定する方法について説明します。

    Ignite UI テーマ ライブラリを使用するには、まずグローバル スタイルでテーマ index ファイルをインポートする必要があります。

    スタイル ライブラリのインポート

    @use "igniteui-angular/theming" as *;
    
    // 重要: Ignite UI for Angular 13 より前のバージョンは、次を使用してください。
    // @import '~igniteui-angular/lib/core/styles/themes/index';
    scss

    以上で Ignite UI for Angular テーマ エンジンによって公開されているすべての機能を使用できます。

    パレットの定義

    インデックス ファイルをインポート後、カスタム パレットを作成します。好きな 3 つの色を定義し、それらを使用して palette でパレットを作成しましょう。

    $white: #fff;
    $blue: #4567bb;
    $gray: #efefef;
    
    $color-palette: palette(
      $primary: $white, 
      $secondary: $blue, 
      $surface: $gray
    );
    scss

    テーマの定義

    これで、パレットを使用してテーマを定義できます。セルは grid-theme によってスタイル設定されているため、それを使用して IgxGrid のテーマを生成できます。

    $custom-grid-theme: grid-theme(
      $cell-editing-background: $blue,
      $cell-edited-value-color: $white,
      $cell-active-border-color: $white,
      $edit-mode-color: color($color-palette, "secondary", 200)
    );
    scss

    テーマを適用

    テーマを適用する最も簡単な方法は、グローバル スタイル ファイルに sass @include ステートメントを使用することです。

    @include grid($custom-grid-theme);
    scss

    デモ

    上記の手順に加えて、セルの編集テンプレートに使用されるコントロールのスタイルを設定することもできます (input-groupdatepicker および checkbox)。

    EXAMPLE
    MODULES
    TS
    HTML
    SCSS

    このサンプルは、Change Theme (テーマの変更) から選択したグローバル テーマに影響を受けません。

    App Builder | CTA Banner

    API リファレンス

    その他のリソース