Web Components Grid 選択の概要

    Web Components Grid の Ignite UI for Web Components 選択機能を使用すると、単純なマウス操作を使用してデータを簡単に操作および操作できます。使用可能な選択モードは 3 つあります。

    • 行の選択
    • セルの選択
    • 列の選択

    rowSelection プロパティを使用すると、以下を指定できます。

    • None (なし)
    • Single (単一)
    • Multiple Select (複数選択)

    Web Components Grid 選択の例

    以下のサンプルは、IgcGridComponent の 3 種類のセル選択動作を示しています。以下のボタンを使用して、利用可能な各選択モードを有効にします。

    Web Components Grid 選択のオプション

    Ignite UI for Web Components IgcGridComponent コンポーネントは、行選択セル選択列選択の 3 つの選択モードを提供します。デフォルトでは、IgcGridComponent複数セル選択モードのみが有効になっています。選択モードの変更または有効化は、rowSelectioncellSelection または selectable プロパティを使用します。

    Web Components Grid 行選択

    プロパティ rowSelection を使用すると、次のオプションを指定できます。

    • None - IgcGridComponent の行選択が無効になります。
    • Single - IgcGridComponent 内の 1 行のみの選択が利用可能になります。
    • Multiple - 複数行の選択は、Ctrl + クリックSpace キー を押して行セレクターを使用することにより、複数行の選択が可能になります。

    詳細については、行選択トピックを参照してください。

    Web Components Grid セル選択

    以下のオプションは、プロパティ cellSelection で指定できます。

    • None - IgcGridComponent のセル選択が無効になります。
    • Single - IgcGridComponent 内の 1 セルのみの選択が利用可能になります。
    • Multiple - IgcGridComponent の選択のデフォルト状態です。複数セルの選択は、マウスの左ボタンを連続してクリックした後、マウスをセル上にドラッグすることで利用できます。

    詳細については、セル選択トピックを参照してください。

    Web Components Grid 列選択

    selectable プロパティを使用して、IgcColumn ごとに以下のオプションを指定できます。このプロパティが true または false に設定されている場合、対応する列の選択がそれぞれ有効または無効になります。

    以下の 3 つのバリエーションがあります。

    • Single selection (単一選択) - 列セルをマウス クリックします
    • Multi column selection (複数列の選択) - Ctrl キーを押しながら列セルをマウス クリックします
    • Range column selection (列の範囲選択) - Shift キーを押しながら + マウス クリック、その間のすべての列が選択されます。

    詳細については、列選択トピックを参照してください。

    Web Components Grid コンテキスト メニュー

    ContextMenu イベントは、カスタム コンテキスト メニューを追加して、IgcGridComponent での作業をアシストします。グリッドの本体を右クリックすると、イベントはトリガーされたセルを放出します。コンテキスト メニューは、放出されたセルで動作します。

    複数セルの選択がある場合、選択したセルが複数セルの選択領域にあるかどうかをチェックするロジックを配置します。その場合、選択したセルの値も出力します。

    基本的に、メイン関数は次のようになります。

        public rightClick(event: any) {
            const eventArgs = event.detail;
            eventArgs.event.preventDefault();
            this.multiCellArgs = {};
            if (this.multiCellSelection) {
              const node = eventArgs.cell.selectionNode;
              const isCellWithinRange = this.grid.getSelectedRanges().some((range) => {
                if (
                  node.column >= range.columnStart &&
                  node.column <= range.columnEnd &&
                  node.row >= range.rowStart &&
                  node.row <= range.rowEnd
                ) {
                  return true;
                }
                return false;
              });
              if (isCellWithinRange) {
                this.multiCellArgs = { data: this.multiCellSelection.data };
              }
            }
            this.contextmenuX = eventArgs.event.clientX;
            this.contextmenuY = eventArgs.event.clientY;
            this.clickedCell = eventArgs.cell;
            this.toggleContextMenu();
          }
    

    以下はコンテキストメニューの機能です。

    • 選択したセルの value のコピー。
    • 選択したセルの dataRow のコピー。
    • 選択したセルが複数セルの選択範囲内にある場合、選択したすべてのデータをコピーします。
        public copySelectedRowData() {
            const selectedData = this.grid.getRowData(this.clickedCell.id.rowID);
            this.copyData(selectedData);
            const selectedDataArea = document.getElementById('selectedArea');
            selectedDataArea.innerText = JSON.stringify(selectedData);
            this.toggleContextMenu();
        }
    
        public copySelectedCellData() {
            const selectedData = this.clickedCell.value;
            this.copyData(selectedData);
            const selectedDataArea = document.getElementById('selectedArea');
            selectedDataArea.innerText = JSON.stringify(selectedData);
            this.toggleContextMenu();
        }
    
    
        public copySelectedData() {
            const selectedData = this.grid.getSelectedData();
            this.copyData(selectedData);
            const selectedDataArea = document.getElementById('selectedArea');
            selectedDataArea.innerText = JSON.stringify(selectedData);
            
            this.toggleContextMenu();
        }
    
        private copyData(data: any[]) {
            const tempElement = document.createElement('input');
            document.body.appendChild(tempElement);
            tempElement.setAttribute('id', 'temp_id');
            (document.getElementById('temp_id') as HTMLInputElement).value = JSON.stringify(data);
            tempElement.select();
            document.execCommand('copy');
            document.body.removeChild(tempElement);
        }
    

    IgcGridComponent はコピーされたデータを取得し、コンテナ要素に貼り付けます。

    グリッドとコンテキスト メニューを組み合わせるために使用するテンプレート:

        <div class="container sample">
          <div class="wrapper">
            <igc-grid auto-generate="false" width="50%" height="100%" name="grid" id="grid">
              <igc-column field="ProductID" header="Product ID">
              </igc-column>
              <igc-column field="ProductName" header="Product Name">
              </igc-column>
              <igc-column field="UnitsInStock" header="Units In Stock" data-type="number">
              </igc-column>
              <igc-column field="UnitPrice" header="Units Price" data-type="number">
              </igc-column>
              <igc-column field="Discontinued" data-type="boolean">
              </igc-column>
              <igc-column field="OrderDate" header="Order Date" data-type="date">
              </igc-column>
            </igc-grid>
            <div id="selectedArea" class="selected-data-area">
            </div>
          </div>
        </div>
        <div id="menu" style="display: none;" class="contextmenu">
          <span id="copySingleCell" class="item">
            <igc-icon name="content_copy"></igc-icon>Copy Cell Data
          </span>
          <span id="copyRow" class="item">
            <igc-icon name="content_copy"></igc-icon>Copy Row Data
          </span>
          <span id="copyMultiCells" class="item">
            <igc-icon name="content_copy"></igc-icon>Copy Cells Data
          </span>
        </div>
      </div>
    

    複数のセルを選択し、マウスの右ボタンを押します。コンテキストメニューが表示され、セル データのコピー を選択すると、選択したデータが右側の空のボックスに表示されます。

    結果:

    既知の問題と制限

    グリッドに primaryKey が設定されておらず、リモート データ シナリオが有効になっている場合 (ページング、ソート、フィルタリング、スクロール時に、グリッドに表示されるデータを取得するためのリモート サーバーへのリクエストがトリガーされる場合)、データ要求が完了すると、行は次の状態を失います:

    • 行の選択
    • 行の展開/縮小
    • 行の編集
    • 行のピン固定

    API リファレンス

    その他のリソース

    コミュニティに参加して新しいアイデアをご提案ください。