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

WPF DataGrid无法显示DataTable数据问题求助

WPF DataGrid无法显示DataTable数据的解决方法

问题情况

接触WPF已有3天,遇到DataGrid无法显示DataTable数据的问题。此前使用WinForms的DataGridView无此问题,尝试代码绑定和XAML绑定均无效。将DataGrid封装为独立UserControl关联主窗口时数据不显示,直接在主窗口测试问题依旧。

现有代码

MainWindow.xaml

<Border> 
  <Grid>
       <Border Grid.Row="1" CornerRadius="20" Margin="15,0,15,15" >
                <!-- Apply Style with Rounded Corners to DataGrid -->
                <DataGrid 
                        IsReadOnly="True"
                        x:Name="dataGrid"
                        AutoGenerateColumns="False">
                    <DataGrid.Resources>
                        <!-- Cell Background -->
                        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#121212"/>
                        <!-- Cell Foreground (Text) -->
                        <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="#FFFFFF"/>
                        <!-- Grid Lines -->
                        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveBorderBrushKey}" Color="#1E1E1E"/>
                        <!-- Header Background -->
                        <SolidColorBrush x:Key="{x:Static SystemColors.ControlDarkDarkBrushKey}" Color="#2E2E2E"/>
                        <!-- Header Foreground (Text) -->
                        <SolidColorBrush x:Key="{x:Static SystemColors.ControlLightLightBrushKey}" Color="#FFFFFF"/>
                    </DataGrid.Resources>
                    <DataGrid.Style>
                        <Style TargetType="DataGrid">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type DataGrid}">
                                        <Border Background="{TemplateBinding Background}" CornerRadius="20">
                                            <ScrollViewer>
                                                <!-- ContentPresenter displays the actual DataGrid content -->
                                                <ContentPresenter/>
                                            </ScrollViewer>
                                        </Border>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </DataGrid.Style>
                </DataGrid>
            </Border>
  </Grid>
</Border>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    private DataTable dataTable;
    public MainWindow()
    {
        InitializeComponent();
        InitializeDataGridAsync();
    }

    private async void InitializeDataGridAsync()
    {
        var newDT = CreateDataTable();
        
        // Simulate a delay for loading data (replace this with your actual data loading logic)
        await Task.Delay(3000);

        // Set the DataTable as the DataGrid's ItemsSource
        dataGrid.ItemsSource = newDT.DefaultView;
    }

    private DataTable CreateDataTable()
    {
        // Create a DataTable with columns
        dataTable = new DataTable("MyDataTable");

        // Add 10 sample columns
        for (int i = 1; i <= 100; i++)
        {
            dataTable.Columns.Add($"Column{i}", typeof(int));
        }

        // Add 100 rows of sample data
        for (int row = 1; row <= 100; row++)
        {
            // Create an array to hold values for each column
            object[] values = new object[100];

            // Assign sample values to each column
            for (int col = 0; col < 100; col++)
            {
                values[col] = row * 100 + col + 1; // You can change this to your desired data
            }

            // Add the row to the DataTable
            dataTable.Rows.Add(values);
        }
        return dataTable;
    }
}

问题截图

DataGrid位置截图

问题原因及解决方法

1. 自定义ControlTemplate错误

你替换了DataGrid的默认模板,仅使用ContentPresenter无法正确渲染DataGrid的内容。DataGrid的默认模板包含DataGridColumnHeadersPresenter(表头)和ItemsPresenter(数据行容器)等核心元素,这些是显示数据的关键。

修复后的模板示例:

<Style TargetType="DataGrid">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGrid}">
                <Border Background="{TemplateBinding Background}" CornerRadius="20" Padding="1">
                    <ScrollViewer Focusable="false" Padding="{TemplateBinding Padding}">
                        <StackPanel>
                            <!-- 表头 -->
                            <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" 
                                                            Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource TemplatedParent}}"/>
                            <!-- 数据行容器 -->
                            <ItemsPresenter x:Name="PART_ItemsPresenter"/>
                        </StackPanel>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

2. 列配置问题

你设置了AutoGenerateColumns="False",但没有手动定义任何列,即使数据绑定成功也无法看到内容。解决方式二选一:

  • 将AutoGenerateColumns改为True,让WPF自动根据DataTable的列生成DataGrid列:
    <DataGrid 
            IsReadOnly="True"
            x:Name="dataGrid"
            AutoGenerateColumns="True">
    
  • 手动添加列(示例,可根据实际列名调整):
    <DataGrid.Columns>
        <DataGridTextColumn Header="Column1" Binding="{Binding Column1}"/>
        <DataGridTextColumn Header="Column2" Binding="{Binding Column2}"/>
        <!-- 更多列... -->
    </DataGrid.Columns>
    

验证步骤

  1. 先移除自定义的ControlTemplate,将AutoGenerateColumns设为True,运行程序看数据是否显示。
  2. 确认数据显示正常后,再逐步添加自定义样式和模板,避免一次性修改过多导致问题难以排查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:47:03