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

后端数据源变更后如何更新SyncFusion Grid的展示数据?

问题根因

你遇到的网格不刷新问题由两个核心错误导致:

  1. 对话框交互时序错误:dialog.OpenDialog() 是非阻塞方法,调用后会直接继续执行后续的插入/更新逻辑,此时用户还未在对话框中填写/修改数据并提交,你操作的是未修改的空对象/原始对象,且数据还未落地到数据库就触发了刷新,自然看不到变化。
  2. 网格刷新方式错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:24:02