如何防止Radzen Blazor DataGrid添加明细后主行自动折叠?
解决Radzen嵌套DataGrid新增明细后主行折叠/明细丢失问题
问题根源
- 初始代码主行折叠:保存明细后调用
await _grid.Reload()会触发主DataGrid重新绑定数据,导致已展开的行状态丢失,自动折叠。 - 修改后明细丢失:仅更新明细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
相关产品推荐
相关产品推荐

