Вложенный L oop счетчик - PullRequest
       30

Вложенный L oop счетчик

0 голосов
/ 09 июля 2020

Я пытаюсь создать вложенный l oop, который принимает заданное количество просмотров на листе, и в зависимости от этого числа, давайте начнем с (1), будет подсчитано 00,01,02,03,04,05 , 06 ... Теперь, если число (2) будет подсчитано 00,00,01,01,02,02, число (3) будет подсчитано 00,00,00,01,01,01

Я пробовал много вариантов приведенного ниже кода, и то, что я вставил, не является самым близким к желаемому результату, но я запутался и не могу понять, что кажется простой операцией. Я не могу назвать свой поиск в Google достаточно хорошо, чтобы найти сравнение.

Пожалуйста, просмотрите прикрепленные изображения, чтобы узнать, что я sh должен делать.

Изменить ... Форма представляет собой radGridView от Telerik

public void ViewsPerSheetChange(object sender, EventArgs e)
{
    int numViewsPerSheet = (int)thisForm.numViewsPerSheet.Value;
    
    for (int i = 0; i < numViewsPerSheet; i++)
    {
        for (int j = 0; j < Models.Count; j++)
        {
            Models[j].SheetObjModel.SheetNumber = i.ToString().PadLeft(2, '0');
            if (j == numViewsPerSheet - 1)
            {
                break;
            }
        }
    }
    thisForm.RefreshDataGrid();
}

Изображение один

Изображение два

Изображение третье

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Вы почти получили это. Вам действительно не нужен вложенный l oop. Используйте целочисленное деление для номера листа. Я повторяю одно и то же число x количество раз, где x - количество просмотров на лист.

Попробуйте:

    public void ViewsPerSheetChange(object sender, EventArgs e)
    {
        int numViewsPerSheet = (int)thisForm.numViewsPerSheet.Value;

        for (int j = 0; j < Models.Count; j++)
        {
            int i = j/numViewsPerSheet; // 0,0,0,1,1,1,2,2,2... for num=3
            Models[j].SheetObjModel.SheetNumber = i.ToString().PadLeft(2, '0');          
        }
        thisForm.RefreshDataGrid();
    }
0 голосов
/ 09 июля 2020

Спасибо за ваши ответы, ваши примеры очень полезны, мне удалось заставить его работать некоторое время l oop.

public void ViewsPerSheetChange(object sender, EventArgs e)
    {
        int numViewsPerSheet = (int)thisForm.numViewsPerSheet.Value;

        int cnt = 0;
        int num = 0;
        if (numViewsPerSheet < 1)
        {
            return;
        }
        while (cnt < Models.Count)
        {
            for (int i = 0; i < numViewsPerSheet; i++)
            {
                Models[cnt].SheetObjModel.SheetNumber = num.ToString().PadLeft(2, '0');
                cnt++;
                if (cnt == Models.Count) break;
                
            }
            num++;
        }
    thisForm.RefreshDataGrid();
    }
0 голосов
/ 09 июля 2020

Пример использования оператора по модулю:

using System;
                    
public class Program
{
    public static void Main()
    {
        int numViewsPerSheet = 2;
        int sheetIndex = 0;
        for ( int i = 0 ; i < 7; i++ )
        {
            Console.WriteLine("Sheet: {0:00}", sheetIndex);
            if( (i+1)%numViewsPerSheet==0)sheetIndex++;
        }
    }
}

См. https://dotnetfiddle.net/xnCMts

Результат:

Sheet: 00
Sheet: 00
Sheet: 01
Sheet: 01
Sheet: 02
Sheet: 02
Sheet: 03

Адаптировано к вашему коду:

public void ViewsPerSheetChange(object sender, EventArgs e)
{
    int viewIndex = 0;
    int numViewsPerSheet = Math.Max((int)thisForm.numViewsPerSheet.Value, 1); // never trust user input!

    for (int i = 0; i < Models.Count; i++) {
        Models[i].SheetObjModel.SheetNumber = viewIndex.ToString("00");
        if ( (i+1)%numViewsPerSheet==0) viewIndex++;
    }
    thisForm.RefreshDataGrid();
}
...