后端数据源变更后如何更新SyncFusion Grid的展示数据?
问题根因
你遇到的网格不刷新问题由两个核心错误导致:
- 对话框交互时序错误:
dialog.OpenDialog()是非阻塞方法,调用后会直接继续执行后续的插入/更新逻辑,此时用户还未在对话框中填写/修改数据并提交,你操作的是未修改的空对象/原始对象,且数据还未落地到数据库就触发了刷新,自然看不到变化。 - 网格刷新方式错误:SfGrid绑定的
IEnumerable<T>集合重新赋值后,需要同时触发组件状态更新和网格主动重绘,仅调用网格内部的CallStateHasChanged无法触发页面级重新渲染。
解决方案
步骤1:给可复用对话框添加确认回调
首先修改你的ReusableDialog.razor,添加确认事件回调,用户点击对话框确认按钮时触发:
@* ReusableDialog.razor 新增参数和逻辑 *@ [Parameter] public EventCallback OnConfirmed { get; set; } // 对话框确认按钮的点击事件 private async Task HandleConfirm() { await OnConfirmed.InvokeAsync(); CloseDialog(); // 确认后关闭弹窗 }
步骤2:修改网格工具栏点击逻辑
将增/改操作从OpenDialog()后移到对话框的OnConfirmed回调中,操作完成后重新拉取数据源并刷新网格:
@code{ // 将Templates改为List类型,避免多次枚举问题 public List<Template> Templates { get; set; } = new(); protected override void OnInitialized() { Templates = WireDeskService.GetTemplates().ToList(); } public async Task OnClicked(Syncfusion.Blazor.Navigations.ClickEventArgs Args) { // 新增逻辑 if (Args.Item.Id == "Add") { Args.Cancel = true; dialog.Title = "新增模板"; dialog.Text = "请填写模板信息"; dialog.template = new Template(); // 绑定确认回调,用户提交后才执行后续逻辑 dialog.OnConfirmed = async () => { WireDeskService.InsertTemplate(dialog.template); // 重新拉取最新数据 Templates = WireDeskService.GetTemplates().ToList(); // 刷新网格 await Grid.Refresh(); // 触发页面状态更新 StateHasChanged(); }; dialog.OpenDialog(); } // 编辑逻辑 if (Args.Item.Id == "Edit") { Args.Cancel = true; var selected = await Grid.GetSelectedRecordsAsync(); if (selected.Count > 0) { dialog.Title = "编辑模板"; dialog.Text = "请修改模板信息"; // 建议深拷贝选中对象,避免未提交就修改网格绑定的原数据 dialog.template = new Template { TemplateId = selected[0].TemplateId, Owner = selected[0].Owner, Users = selected[0].Users, Description = selected[0].Description, FundType = selected[0].FundType }; dialog.OnConfirmed = async () => { WireDeskService.UpdateTemplate(dialog.template.TemplateId, dialog.template); Templates = WireDeskService.GetTemplates().ToList(); await Grid.Refresh(); await Grid.ClearSelectionAsync(); StateHasChanged(); }; dialog.OpenDialog(); } } } }
步骤3:删除操作适配(如果存在)
删除逻辑也按照上述模式实现,在删除确认的回调中执行删除、重拉数据、刷新网格的操作即可。
内容的提问来源于stack exchange,提问作者Bryan Schmiedeler
相关产品推荐
相关产品推荐

