.NET 7 Quick Grid筛选器刷新异常及过滤计数滞后问题
解决Blazor QuickGrid筛选计数UI滞后问题
问题根源
你之前在FilteredQuickProjects的getter中维护CurrentFilters,但这个getter会在网格分页、排序、数据渲染等多个场景被调用,UI渲染CurrentFilters.Count的时机和getter执行时机不匹配,导致显示滞后。而在getter中调用StateHasChanged()会触发组件重新渲染,渲染过程又会再次调用getter,形成无限循环。
修复方案
1. 拆分筛选逻辑与状态维护
把CurrentFilters的更新从数据筛选属性中剥离,放到筛选变量的setter中,确保筛选条件变化时立刻更新计数:
private string _filterProjectName; public string filterProjectName { get => _filterProjectName; set { if (_filterProjectName != value) { _filterProjectName = value; UpdateFilterCount(); // 通知QuickGrid刷新数据 MyWorkGrid?.RefreshDataAsync(); } } } private void UpdateFilterCount() { CurrentFilters.Clear(); // 逐个检查筛选条件 if (!string.IsNullOrWhiteSpace(filterProjectName)) CurrentFilters.Add("ProjectName"); // 其他筛选条件(如filterStatus、filterDate等)同理添加判断 }
2. 简化筛选属性逻辑
修改FilteredQuickProjects,只负责数据筛选,不再修改CurrentFilters:
public IQueryable<MyWorkViewModel> FilteredQuickProjects { get { if (!PageIsLoaded) return MyQuickProjects; var result = MyQuickProjects.AsQueryable(); if (!string.IsNullOrWhiteSpace(filterProjectName)) { result = result.Where(x => x.Name.Contains(filterProjectName, StringComparison.InvariantCultureIgnoreCase)); } // 其他筛选条件的Where语句 return result; } }
3. 实现清除筛选按钮
在UI中根据CurrentFilters.Count控制按钮显示,并添加清除逻辑:
<div class="d-flex align-items-center"> <label class="ms-3">Filters: @CurrentFilters.Count</label> @if (CurrentFilters.Count > 0) { <button class="btn btn-sm btn-outline-secondary ms-2" @onclick="ClearAllFilters">清除所有筛选</button> } </div> <!-- 原QuickGrid代码保持不变 -->
对应的清除方法:
private void ClearAllFilters() { // 清空所有筛选变量 filterProjectName = string.Empty; // 其他筛选变量(如filterStatus等)设为默认值 UpdateFilterCount(); MyWorkGrid?.RefreshDataAsync(); }
原理说明
通过筛选变量的setter实时更新CurrentFilters,确保UI显示的计数和实际筛选状态完全同步。同时用MyWorkGrid.RefreshDataAsync()主动通知网格刷新数据,避免依赖属性getter的被动调用,彻底解决计数滞后和无限循环问题。
内容的提问来源于stack exchange,提问作者Grandizer
相关产品推荐
相关产品推荐

