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

WPF中如何实现DataGrid显示空行网格线且支持末尾新增行?

WPF DataGrid 效果实现方案

期望效果

期望效果
要实现两个核心需求:

  1. 无绑定数据时也显示完整的行网格线,不会出现空白区域
  2. 填充数据后,底部自带可直接录入的新增行,支持用户快速添加数据

实现步骤

1. 开启底部新增行功能

WPF DataGrid 自带该能力,无需额外自定义控件:

  • XAML中给DataGrid添加属性 CanUserAddRows="True"
  • 绑定的数据源需为ObservableCollection<T>类型,且泛型T对应的实体类要有公共无参构造函数,保证新增行逻辑正常生效

2. 无数据时显示空网格线

通过添加空白占位行的方式实现,逻辑简单且兼容性好:

XAML 示例代码

<DataGrid 
    x:Name="MyDataGrid"
    CanUserAddRows="True"
    AutoGenerateColumns="False"
    RowHeight="25"
    ItemsSource="{Binding DataList}"
    Loaded="MyDataGrid_Loaded"
    BeginningEdit="MyDataGrid_BeginningEdit">
    <DataGrid.Columns>
        <!-- 按需配置你的业务列 -->
        <DataGridTextColumn Header="序号" Binding="{Binding Id}" />
        <DataGridTextColumn Header="名称" Binding="{Binding Name}" />
        <DataGridTextColumn Header="数值" Binding="{Binding Value}" />
    </DataGrid.Columns>
</DataGrid>

后台逻辑代码(C#)

首先定义业务实体类:

public class BizItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public double Value { get; set; }
    // 标识是否为占位空行
    public bool IsPlaceholder { get; set; } = false;

    // 必须有公共无参构造函数
    public BizItem() { }
}

页面逻辑代码:

// 绑定的数据源
public ObservableCollection<BizItem> DataList { get; set; } = new ObservableCollection<BizItem>();

private void MyDataGrid_Loaded(object sender, RoutedEventArgs e)
{
    // 初始化填充空行
    FillPlaceholderRows();
    // 监听数据源变化,动态调整占位行数量
    DataList.CollectionChanged += (s, args) => FillPlaceholderRows();
}

// 填充占位空行方法
private void FillPlaceholderRows()
{
    // 计算当前DataGrid可视区域可容纳的总行数(减去表头和自带新增行的高度)
    int availableRowCount = (int)Math.Floor((MyDataGrid.ActualHeight - MyDataGrid.ColumnHeaderHeight - 25) / MyDataGrid.RowHeight);
    // 现有有效业务数据行数(排除占位行)
    int validRowCount = DataList.Count(x => !x.IsPlaceholder);
    // 需要补充的占位行数量
    int needPlaceholderCount = availableRowCount - validRowCount;

    // 先移除所有旧的占位行
    foreach (var placeholder in DataList.Where(x => x.IsPlaceholder).ToList())
    {
        DataList.Remove(placeholder);
    }

    // 补充对应数量的新占位行
    for (int i = 0; i < needPlaceholderCount; i++)
    {
        DataList.Add(new BizItem { IsPlaceholder = true });
    }
}

// 处理编辑事件,将占位行转为有效业务行
private void MyDataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    if (e.Row.Item is BizItem item && item.IsPlaceholder)
    {
        item.IsPlaceholder = false;
        // 编辑占位行后补充新的占位行,保证网格始终填满
        FillPlaceholderRows();
    }
}

注意事项

  • 若DataGrid高度随窗口自适应,可监听窗口大小变化事件,触发FillPlaceholderRows方法重新计算占位行数量
  • 提交数据时只需过滤掉IsPlaceholder = true的占位行即可,不会影响业务数据提交

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:27:01