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

嵌套循环计数器实现问题:按指定每页视图数生成序列

解决Views Per Sheet计数序列生成问题

我来帮你搞定这个循环逻辑的问题!你想要的是每个序号重复指定的次数(比如Views Per Sheet为2时,00出现两次、01出现两次,以此类推),对吧?咱先看看你当前代码的问题所在:

  • 外层循环只跑了numViewsPerSheet次,但实际上你需要根据Models的总数量来生成足够多的组,每个组重复指定次数
  • 内层循环每次遍历所有Models,这意味着每次外层循环的i值都会覆盖之前设置的SheetNumber,最后所有Models的序号都会变成最后一个i的值(比如num=2的话,最后全是01)
  • 那个break语句完全多余,它只会让内层循环提前终止,根本达不到你要的重复效果

正确实现方式1:单循环直接计算组号(简洁高效)

这种方式直接通过索引计算每个Model所属的组,逻辑清晰且性能更好:

public void ViewsPerSheetChange(object sender, EventArgs e) {
    int numViewsPerSheet = (int)thisForm.numViewsPerSheet.Value;
    for (int j = 0; j < Models.Count; j++) {
        // 计算当前Model的组号:索引除以每页视图数取整数部分
        int groupNumber = j / numViewsPerSheet;
        // 转成两位带前导零的字符串
        Models[j].SheetObjModel.SheetNumber = groupNumber.ToString().PadLeft(2, '0');
    }
    thisForm.RefreshDataGrid();
}

举个例子:当numViewsPerSheet=3时,j=0、1、2的组号都是0(对应00),j=3、4、5的组号都是1(对应01),完美符合你要的序列。

正确实现方式2:嵌套循环(直观展示重复逻辑)

如果你更倾向于用嵌套循环来直观控制重复次数,可以这样写(注意避免索引越界):

public void ViewsPerSheetChange(object sender, EventArgs e) {
    int numViewsPerSheet = (int)thisForm.numViewsPerSheet.Value;
    int currentModelIndex = 0;
    int currentGroup = 0;
    
    // 循环直到所有Model都被处理
    while (currentModelIndex < Models.Count) {
        // 给当前组的numViewsPerSheet个Model设置同一个序号
        for (int i = 0; i < numViewsPerSheet && currentModelIndex < Models.Count; i++) {
            Models[currentModelIndex].SheetObjModel.SheetNumber = currentGroup.ToString().PadLeft(2, '0');
            currentModelIndex++;
        }
        currentGroup++;
    }
    thisForm.RefreshDataGrid();
}

这里外层用while循环控制组号,内层循环负责给每组的numViewsPerSheet个Model赋值,同时通过currentModelIndex确保不会超出Models的总数。

另外,你用Telerik RadGridView的话,修改完Model属性后调用RefreshDataGrid()是正确的,这样GridView会及时刷新显示最新的序号值~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:42:35