You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 14带下拉菜单的表格展开面板实现方案问询

解决方案

方案一:Angular Material 实现(自定义程度高)

利用 MatTable 配合 MatExpansionPanel 实现,表头保持单行结构,每行的展开区域嵌入表格扩展行中,下拉菜单使用 MatSelect 组件。

模板代码

<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
  <!-- 定义表头列 -->
  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef> 名称 </th>
    <td mat-cell *matCellDef="let element"> {{element.name}} </td>
  </ng-container>
  <ng-container matColumnDef="position">
    <th mat-header-cell *matHeaderCellDef> 位置 </th>
    <td mat-cell *matCellDef="let element"> {{element.position}} </td>
  </ng-container>
  <!-- 展开触发列 -->
  <ng-container matColumnDef="expand">
    <th mat-header-cell *matHeaderCellDef></th>
    <td mat-cell *matCellDef="let element">
      <button mat-icon-button (click)="element.expanded = !element.expanded">
        <mat-icon>{{element.expanded ? 'expand_less' : 'expand_more'}}</mat-icon>
      </button>
    </td>
  </ng-container>

  <!-- 主数据行 -->
  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let element; columns: displayedColumns;" 
      [class.expanded-row]="element.expanded"></tr>

  <!-- 展开详情行 -->
  <tr mat-row *matRowDef="let element; columns: ['expandedDetail']" 
      [@detailExpand]="element.expanded ? 'expanded' : 'collapsed'">
    <td colspan="3">
      <mat-expansion-panel [expanded]="element.expanded" (opened)="element.expanded=true" (closed)="element.expanded=false">
        <mat-expansion-panel-header>
          <mat-panel-title>操作选项</mat-panel-title>
        </mat-expansion-panel-header>
        <!-- 下拉菜单 -->
        <mat-form-field appearance="fill">
          <mat-label>选择操作</mat-label>
          <mat-select>
            <mat-option value="option1">选项1</mat-option>
            <mat-option value="option2">选项2</mat-option>
            <mat-option value="option3">选项3</mat-option>
          </mat-select>
        </mat-form-field>
        <p>更多详情内容...</p>
      </mat-expansion-panel>
    </td>
  </tr>
</table>

组件类代码

import { Component } from '@angular/core';
import { animate, state, style, transition, trigger } from '@angular/animations';

export interface PeriodicElement {
  name: string;
  position: number;
  expanded: boolean;
}

const ELEMENT_DATA: PeriodicElement[] = [
  {position: 1, name: 'Hydrogen', expanded: false},
  {position: 2, name: 'Helium', expanded: false},
  {position: 3, name: 'Lithium', expanded: false},
];

@Component({
  selector: 'table-expandable-rows-example',
  templateUrl: 'table-expandable-rows-example.html',
  styleUrls: ['table-expandable-rows-example.css'],
  animations: [
    trigger('detailExpand', [
      state('collapsed', style({height: '0px', minHeight: '0'})),
      state('expanded', style({height: '*'})),
      transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
    ]),
  ],
})
export class TableExpandableRowsExample {
  displayedColumns: string[] = ['position', 'name', 'expand'];
  dataSource = ELEMENT_DATA;
}

方案二:DevExpress DxDataGrid 实现(快速简便)

DevExpress 的 DxDataGrid 内置行展开功能,可直接通过配置启用,并自定义展开模板嵌入下拉菜单(DxSelectBox),无需手动管理状态和动画。

模板代码

<dx-data-grid
  [dataSource]="dataSource"
  [rowExpansionEnabled]="true"
>
  <dxo-columns>
    <dxi-column dataField="position" caption="位置"></dxi-column>
    <dxi-column dataField="name" caption="名称"></dxi-column>
    <dxi-column type="expand"></dxi-column>
  </dxo-columns>

  <div *dxTemplate="let data of 'expandedRow'">
    <dx-select-box
      [items]="operationOptions"
      displayExpr="text"
      valueExpr="value"
      placeholder="选择操作"
    ></dx-select-box>
    <p>更多详情内容:{{data.data.name}} 的额外信息</p>
  </div>
</dx-data-grid>

组件类代码

import { Component } from '@angular/core';

export interface DataItem {
  position: number;
  name: string;
}

export interface OptionItem {
  text: string;
  value: string;
}

@Component({
  selector: 'app-dx-grid-expand',
  templateUrl: './dx-grid-expand.component.html',
})
export class DxGridExpandComponent {
  dataSource: DataItem[] = [
    {position: 1, name: 'Hydrogen'},
    {position: 2, name: 'Helium'},
    {position: 3, name: 'Lithium'},
  ];

  operationOptions: OptionItem[] = [
    {text: '选项1', value: 'option1'},
    {text: '选项2', value: 'option2'},
    {text: '选项3', value: 'option3'},
  ];
}

方案选择

  • 若需要高度自定义布局和交互逻辑,优先选 Angular Material 方案;
  • 若追求开发效率、无需复杂自定义,DevExpress DxDataGrid 是更简便的选择。

内容的提问来源于stack exchange,提问作者Scottish Smile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:35:17