嵌套循环计数器实现问题:按指定每页视图数生成序列
解决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
相关产品推荐
相关产品推荐

