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

如何防止Radzen Blazor DataGrid添加明细后主行自动折叠?

解决Radzen嵌套DataGrid新增明细后主行折叠/明细丢失问题

问题根源

  1. 初始代码主行折叠:保存明细后调用await _grid.Reload()会触发主DataGrid重新绑定数据,导致已展开的行状态丢失,自动折叠。
  2. 修改后明细丢失:仅更新明细Grid的行,但未将新增的明细同步到主订单的OrderDetailsDto集合中,重新展开订单时,明细Grid绑定的还是旧的集合数据,看不到新增内容。

解决方案

核心思路:避免重载主Grid,直接更新内存中对应订单的明细集合,同时刷新明细Grid,既保留主行展开状态,又能让重新展开时看到最新明细。

步骤1:调整主订单集合类型

将_ordersDto从IQueryable<OrderDto?>改为List<OrderDto?>,因为IQueryable是延迟查询,内存中不会保留修改后的集合数据:

// 替换原有定义
List<OrderDto?> _ordersDto = new();

在OnInitializedAsync中修改映射代码:

// 转为List,将查询结果加载到内存中
_ordersDto = Mapper.ProjectTo<OrderDto>(_order).ToList();

步骤2:修改明细保存方法

更新OnCreateRowDetail,将新增的明细同步到对应订单的明细集合中,无需重载主Grid:

private async Task OnCreateRowDetail(OrderDetailDto? orderDetail)
{
    if (orderDetail == null) return;

    // 映射实体并保存到数据库
    var orderDetailEntity = Mapper.Map<OrderDetail>(orderDetail);
    var addedEntity = await AddOrderDetailUseCase.ExecuteAsync(orderDetailEntity);
    
    // 将保存后的实体映射回Dto
    var addedDto = Mapper.Map<OrderDetailDto>(addedEntity);

    // 找到当前订单,更新其明细集合
    var targetOrder = _ordersDto.FirstOrDefault(o => o?.Id == orderDetail.OrderId);
    if (targetOrder != null)
    {
        // 确保明细集合是可修改的List类型
        if (targetOrder.OrderDetailsDto == null)
        {
            targetOrder.OrderDetailsDto = new List<OrderDetailDto>();
        }
        ((List<OrderDetailDto>)targetOrder.OrderDetailsDto).Add(addedDto);
    }

    // 更新明细Grid的行,保持UI同步
    await _gridDetail.UpdateRow(orderDetail);
}

说明

  • 不调用_grid.Reload(),主DataGrid不会重新绑定,展开状态得以保留。
  • 直接修改内存中_ordersDto的明细集合,重新展开订单时,明细Grid会绑定到更新后的集合,新增的明细会正常显示。
  • 确保OrderDetailsDto是List<OrderDetailDto>类型(而非只读的IEnumerable),这样才能执行添加操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:45:53