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

Blazor Server动态表格点击轴名始终显示最后轴参数问题排查

问题根源

这是Blazor里常见的循环变量捕获坑。你用的for循环里,j是在循环外声明的同一个变量,所有@onclick绑定的lambda表达式抓的是这个变量的引用,不是循环时的当前值。等循环跑完,j的最终值是7(因为循环到j<8,最后一次循环j=7,之后j++变成8就退出了),所以不管点哪个轴,传给Select_CNC_AX_par的都是7,自然只会显示AX7的参数。

修复方案

在for循环内部新建一个局部变量,把当前的j值存进去,让每个点击事件绑定独立的变量:

<table>
@{  
    for (int j = 0; j < 8; j++)
    {
        var currentAxisIndex = j; // 用局部变量捕获当前循环的索引
        <tr>
            <td @onclick='@(e => Select_CNC_AX_par(currentAxisIndex))'>@CNC_AX_Names[currentAxisIndex]</td>
        </tr>
    }
}
</table>

<table>
@{  
    for (int m = 0; m < arraylenght; m++)                            
    {
        <tr>
            <td>@CNC_AX_parameter[m]</td> <!-- 这里要加@才能输出变量值,原代码漏了 -->
        </tr>
    }
}
</table>

@code {
    // 原代码里方法参数写的aksno,内部用的axno,这里要统一,不然会报错
    public void Select_CNC_AX_par(int axno)
    {
        for(int k=0; k < arraylenght;k++)
        {      
            CNC_AX_parameter[k] = CNC_AX_MD[k, axno];
        }
        StateHasChanged(); // 修改数组后通知组件更新状态,确保界面刷新
    }
}
额外优化(更适合动态轴数)

如果轴的数量是动态变化的,用foreach遍历会更省心,还能直接避免捕获问题:

<table>
@foreach (var (axisName, index) in CNC_AX_Names.Select((name, idx) => (name, idx)))
{
    <tr>
        <td @onclick='@(() => Select_CNC_AX_par(index))'>@axisName</td>
    </tr>
}
</table>

用Select把每个轴名和对应的索引配对,foreach会为每一项创建独立的变量,自然不会出现引用捕获的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:39:51