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
相关产品推荐
相关产品推荐

