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
相关产品推荐
相关产品推荐

