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

WPF中如何将DataTable作为另一个DataTable的单元格值显示?

WPF实现DataTable嵌套表格显示的解决方案

问题出在:当你把DataTable作为DataColumn的类型时,WPF的DataGrid在自动生成列(AutoGenerateColumns="True")时,会默认用TextBlock显示该对象的ToString()结果(也就是System.Data.DataTable),而非渲染成表格。要实现嵌套显示,需要自定义该列的模板,让它加载嵌套的DataGrid并绑定到对应的子DataTable。

具体实现步骤

1. XAML部分

先给主DataGrid绑定数据源,并订阅AutoGeneratingColumn事件,用于拦截并自定义嵌套列:

<DataGrid x:Name="MainDataGrid" 
          AutoGenerateColumns="True" 
          AutoGeneratingColumn="MainDataGrid_AutoGeneratingColumn"
          Margin="10"/>

2. 后台事件处理

在AutoGeneratingColumn事件中,判断当前列的类型是否为DataTable,如果是则替换为包含嵌套DataGrid的模板列:

private void MainDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    // 识别DataTable类型的列
    if (e.PropertyType == typeof(DataTable))
    {
        // 取消默认生成的列
        e.Cancel = true;

        // 创建自定义模板列
        var templateColumn = new DataGridTemplateColumn
        {
            Header = e.Column.Header,
            CellTemplate = new DataTemplate()
        };

        // 构建嵌套DataGrid的模板
        var nestedGridFactory = new FrameworkElementFactory(typeof(DataGrid));
        // 自动生成嵌套表格的列
        nestedGridFactory.SetValue(DataGrid.AutoGenerateColumnsProperty, true);
        // 绑定到当前行的DataTable字段
        nestedGridFactory.SetValue(DataGrid.ItemsSourceProperty, new Binding(e.PropertyName));
        // 可选:优化嵌套表格的显示样式
        nestedGridFactory.SetValue(DataGrid.HeadersVisibilityProperty, DataGridHeadersVisibility.None);
        nestedGridFactory.SetValue(DataGrid.RowHeightProperty, 22.0);
        nestedGridFactory.SetValue(DataGrid.MarginProperty, new Thickness(2));
        nestedGridFactory.SetValue(ScrollViewer.HorizontalScrollBarVisibilityProperty, ScrollBarVisibility.Auto);

        templateColumn.CellTemplate.VisualTree = nestedGridFactory;
        // 将自定义列添加到主DataGrid
        ((DataGrid)sender).Columns.Add(templateColumn);
    }
}

3. 数据源绑定

你的curDataTable创建代码无需修改,直接绑定到主DataGrid即可:

// 假设_dataTable是已填充好数据的子表格
var curDataTable = new DataTable();
curDataTable.Columns.Add("name", typeof(string));
curDataTable.Columns.Add("table", typeof(DataTable));

DataRow curRowData = curDataTable.NewRow();
curRowData[0] = "jones";
curRowData[1] = _dataTable;
curDataTable.Rows.Add(curRowData);

// 绑定主表格数据源
MainDataGrid.ItemsSource = curDataTable.DefaultView;

可选优化

  • 如果不需要嵌套表格的表头,可保持HeadersVisibility=None;
  • 给嵌套DataGrid设置IsReadOnly="True",避免用户编辑子表格;
  • 调整嵌套表格的行高、边距,让整体布局更紧凑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:31:26