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

Blazor中如何从SfGrid及GridColumn调用带参数的函数

SfGrid 行级参数传参实现方案

要在SyncFusion SfGrid里调用和当前行绑定数据相关的自定义方法,核心是用列模板获取当前行的上下文对象,不能直接写死取集合第一条数据。


具体实现

SfGrid的自定义列渲染需要用到GridColumn的Template模板段,模板内的内置变量context对应当前渲染行绑定的实体对象,和你原生写foreach时拿到的equipamento是同一个东西,直接取对应属性传参即可。

修正后和原生效果完全对齐的SfGrid代码

@* 排序直接绑定在DataSource上,和原生OrderByDescending逻辑一致 *@
<SfGrid DataSource="@equipamentos.OrderByDescending(e => e.Nome)" AllowPaging="true" AllowSorting="true" AllowFiltering="true">
    <GridPageSettings PageSize="20"></GridPageSettings>
    <GridColumns>
        <GridColumn 
            Field=@nameof(Equipamento.Nome) 
            HeaderText="Nome" 
            TextAlign="TextAlign.Center" 
            Width="15%">
            @* 对应原生表格Nome列的加粗、点击查看详情逻辑 *@
            <Template>
                var currentRow = (Equipamento)context;
                <span style="font-weight: bold; cursor: pointer;" 
                    @onclick="() => MostrarInfoEquipamento(currentRow.IdEquipamento)">
                    @currentRow.Nome
                </span>
            </Template>
        </GridColumn>
        <GridColumn 
            Field=@nameof(Equipamento.Marca) 
            HeaderText="Marca" 
            TextAlign="TextAlign.Center" 
            Width="15%">
        </GridColumn>
        <GridColumn 
            Field=@nameof(Equipamento.Modelo) 
            HeaderText="Modelo" 
            TextAlign="TextAlign.Center" 
            Width="15%">
        </GridColumn>
        <GridColumn 
            Field=@nameof(Equipamento.Utilizador)
            HeaderText="Utilizador" 
            TextAlign="TextAlign.Center" 
            Width="15%">
        </GridColumn>
        <GridColumn 
            Field=@nameof(Equipamento.Observacoes)
            HeaderText="Observações" 
            TextAlign="TextAlign.Center" 
            Width="30%">
        </GridColumn>
        <GridColumn
            HeaderText="Nº Int"
            TextAlign="TextAlign.Center"
            Width="10%">
            <Template>
                var currentRow = (Equipamento)context;
                @* 传当前行的设备ID,和原生foreach里的传参逻辑完全一致 *@
                @NumeroIntervencoesCount(currentRow.IdMigracao)
            </Template>
        </GridColumn>
    </GridColumns>
</SfGrid>

可选性能优化

你现在用的NumeroIntervencoesCount方法每渲染一行就要全量遍历所有干预记录,数据量上来之后会卡顿,可以改成一次性预计算所有设备对应的干预数量,渲染时直接查结果:

// 组件初始化、加载完equipamentos和intervencoes数据后调用一次即可
private Dictionary<int, int> _intervCountMap = new();
private void BuildIntervCountMap()
{
    _intervCountMap = intervencoes
        .GroupBy(i => i.IdEquipamento)
        .ToDictionary(g => g.Key, g => g.Count());
}

// 优化后的计数方法,不用每次循环全量数据
public string NumeroIntervencoesCount(int equipamentoAtual)
{
    return _intervCountMap.TryGetValue(equipamentoAtual, out var count) ? count.ToString() : "0";
}

小提示

如果觉得每次把context强转成Equipamento麻烦,可以给SfGrid标签加@typeparam TItem="Equipamento"指定绑定的实体类型,模板里的context会自动识别成强类型,不用手动转换。


内容的提问来源于stack exchange,提问作者Gonçalo Nogueira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:36:18