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

Blazor中Telerik Grid数据填充完成是否有回调方法?

Blazor Telerik Grid 数据加载完成后触发打印的解决方案

你遇到的问题根源是:OnAfterRender触发时,Grid的数据虽然已经绑定,但内部DOM渲染还未完成,导致打印时Grid为空。以下是几种可靠的解决方法:

方法1:数据加载标记 + JS监听Grid DOM渲染完成

通过标记位记录数据加载状态,结合JS等待Grid内容渲染到DOM后再触发打印:

组件代码

<TelerikGrid @ref="_gridRef" Data="@GridData" Pageable="true">
    <!-- 自定义列定义 -->
    <GridColumns>
        <GridColumn Field="@nameof(MyModel.Id)" Title="ID" />
        <GridColumn Field="@nameof(MyModel.Name)" Title="名称" />
    </GridColumns>
</TelerikGrid>

@code {
    private List<MyModel> GridData { get; set; } = new();
    private ElementReference _gridRef;
    private bool _dataLoaded = false;
    private bool _printTriggered = false;

    protected override async Task OnInitializedAsync()
    {
        // 调用REST API获取数据
        GridData = await MyDataApi.FetchGridDataAsync();
        _dataLoaded = true;
        // 通知组件重新渲染
        await InvokeAsync(StateHasChanged);
    }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (_dataLoaded && !_printTriggered)
        {
            _printTriggered = true;
            // 等待Grid内容渲染到DOM
            await JSRuntime.InvokeAsync<bool>("waitForGridContent", _gridRef);
            // 触发打印
            await JSRuntime.InvokeVoidAsync("window.print");
        }
    }

    // 示例数据模型
    public class MyModel
    {
        public int Id { get; set; }
        public string Name { get; set; } = string.Empty;
    }
}

辅助JS代码(添加到wwwroot/js/site.js)

function waitForGridContent(gridElement) {
    return new Promise(resolve => {
        const checkContent = () => {
            const contentArea = gridElement.querySelector('.k-grid-content');
            // 检查Grid内容区域是否有数据行
            if (contentArea && contentArea.querySelectorAll('tr').length > 0) {
                resolve(true);
            } else {
                // 每50ms检查一次,直到内容加载完成
                setTimeout(checkContent, 50);
            }
        };
        checkContent();
    });
}

方法2:服务器端绑定场景(OnRead事件)

如果Grid使用服务器端分页/过滤(通过OnRead事件加载数据),可以在数据返回后触发打印:

<TelerikGrid Data="@GridData" OnRead="@HandleGridRead" Pageable="true">
    <GridColumns>
        <GridColumn Field="@nameof(MyModel.Id)" Title="ID" />
        <GridColumn Field="@nameof(MyModel.Name)" Title="名称" />
    </GridColumns>
</TelerikGrid>

@code {
    private List<MyModel> GridData { get; set; } = new();
    private bool _printAfterFirstLoad = false;

    private async Task HandleGridRead(GridReadEventArgs args)
    {
        // 调用API获取分页数据
        var apiResult = await MyDataApi.FetchPaginatedDataAsync(args.Request);
        GridData = apiResult.Data;
        args.Total = apiResult.TotalCount;

        // 首次加载完成后触发打印
        if (!_printAfterFirstLoad)
        {
            _printAfterFirstLoad = true;
            // 短延迟确保Grid完成DOM渲染
            await Task.Delay(100);
            await JSRuntime.InvokeVoidAsync("window.print");
        }
    }

    public class MyModel
    {
        public int Id { get; set; }
        public string Name { get; set; } = string.Empty;
    }
}

核心注意事项

  • 必须使用_printTriggered这类标记位,避免每次组件渲染都重复触发打印
  • 不要依赖firstRender:API请求是异步的,数据加载可能在非首次渲染周期完成
  • JS监听是最可靠的方式:Blazor渲染和DOM更新异步执行,C#代码无法直接感知Grid内部的渲染完成时机

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:40:19