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

如何以编程方式清除MudDatagrid多选状态?解决重载选中残留问题

MudDataGrid 多选重载后选中状态残留问题解决办法

问题根源

你遇到的问题是因为MudDataGrid内部维护着选中项的引用集合,重载列表后旧的实体引用没被清除,即便你清空了自己的lstSerialNo,组件依然会把这些旧引用包含在SelectedItemsChanged的参数里。另外如果你的TestMain实体没正确实现相等性判断,组件也会误将新旧数据的实体视为同一对象,导致选中状态残留。

解决步骤

  • 重载数据时清空组件内部选中状态
    给MudDataGrid添加引用,在重载列表的方法里主动调用组件的清空选中方法:

    <!-- 给DataGrid添加ref -->
    <MudDataGrid @ref="_dataGrid" T="TestMain" SelectedItemsChanged="SelectedItemsChanged" ...>
        <!-- 列定义 -->
    </MudDataGrid>
    
    private MudDataGrid<TestMain> _dataGrid;
    
    // 你的重载列表方法,比如LoadData()
    private void LoadData()
    {
        // 先清空组件选中状态
        _dataGrid?.ClearSelection();
        // 然后加载新数据
        // ...你的数据加载逻辑
    }
    
  • 为TestMain实现正确的相等性判断
    基于实体的唯一标识(比如假设你有Id字段)重写Equals和GetHashCode,让MudDataGrid能正确区分新旧实体:

    public class TestMain
    {
        public int Id { get; set; } // 假设这是唯一标识
        public bool isPin { get; set; }
        public int StatusId { get; set; }
    
        public override bool Equals(object obj)
        {
            return obj is TestMain main && Id == main.Id;
        }
    
        public override int GetHashCode()
        {
            return HashCode.Combine(Id);
        }
    }
    
  • 优化SelectedItemsChanged方法
    可以保留你原有的逻辑,也可选过滤掉当前数据列表中不存在的项:

    private void SelectedItemsChanged(HashSet<TestMain> selectedItems)
    {
        lstSerialNo.Clear();
    
        if (selectedItems?.Any() == true)
        {
            // 可选:过滤掉当前数据列表中不存在的项
            var validItems = selectedItems.Intersect(YourDataList);
            lstSerialNo.AddRange(validItems.Select(x => new TestMain
            {
                isPin = x.isPin,
                StatusId = x.StatusId,
                Id = x.Id
            }));
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:00:04