Список объектов два столбца логика - PullRequest
1 голос
/ 28 октября 2019

Я зацикливаю таблицу данных, имеющую 118 строк данных, разбивая их на два столбца. Я хотел бы, чтобы данные в списке [0] были row1 и row41. Работает ли он нормально, пока не дойдет до строки 81, и он не прекратит использовать ColumnTwo, потому что dataTable.Rows.Count равен 118, а i + ROWS_PER_PAGE равен 120, поэтому он не пойдет в построение ColumnTwo.

Есть ли что-точто мне не хватает в моей логике? поэтому он заполнит ColumnTwo?

public List<DataForExcelExport> Fill(DataTable dataTable)
{
    var list = new List<DataForExcelExport>();
    const int ROWS_PER_PAGE = 40;
    for (int i = 0; i < dataTable.Rows.Count; i++)
    {
        DataRow dr = dataTable.Rows[i];
        var item = new DataForExcelExport();
        SetItemData(dr, item, true);
         if (i + ROWS_PER_PAGE < dataTable.Rows.Count)
        //if (i < dataTable.Rows.Count)
        {
            SetItemData(dataTable.Rows[i + ROWS_PER_PAGE], item, false);
        }
        //New Logic
        else
        {
            int x = (dataTable.Rows.Count - i)/2;
            ROWS_PER_PAGE = x;
            SetItemData(dataTable.Rows[i + ROWS_PER_PAGE], item, false);
        }
        list.Add(item);
        if ((i + 1) % ROWS_PER_PAGE == 0)
        {
            i += ROWS_PER_PAGE;
        }

    }
    return list;
}

static void SetItemData(DataRow row, DataForExcelExport item, bool itIsAFirstColumnItem)
{
    if (itIsAFirstColumnItem)
    {
        item.ColumnOneRowId = row.Field<Int64>("rowid");
        item.ColumnOneFirstName = row.Field<string>("FirstName");
        item.ColumnOneLastName = row.Field<string>("LastName");
        item.ColumnOneOfficePhoneNumber = row.Field<string>("OfficePhoneNumber");
        item.ColumnOneExtension = row.Field<string>("Extension");
    }
    else
    {
        item.ColumnTwoRowId = row.Field<Int64>("rowid");
        item.ColumnTwoFirstName = row.Field<string>("FirstName");
        item.ColumnTwoLastName = row.Field<string>("LastName");
        item.ColumnTwoOfficePhoneNumber = row.Field<string>("OfficePhoneNumber");
        item.ColumnTwoExtension = row.Field<string>("Extension");
    }
}

public class DataForExcelExport
{
    public Int64 ColumnOneRowId { get; set; }
    public string ColumnOneFirstName { get; set; }
    public string ColumnOneLastName { get; set; }
    public string ColumnOneOfficePhoneNumber { get; set; }
    public string ColumnOneExtension { get; set; }

    public Int64 ColumnTwoRowId { get; set; }
    public string ColumnTwoFirstName { get; set; }
    public string ColumnTwoLastName { get; set; }
    public string ColumnTwoOfficePhoneNumber { get; set; }
    public string ColumnTwoExtension { get; set; }
}

ожидаемый результат:

- page 1 
_________
  1 | 41
... |...
 38 | 78
 39 | 79
 40 | 80
_________

- page 2
_________
 81 | 99
 82 | 100
... | ...
98  |118
_________

Using new logic

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Ожидается следующий вывод:

- page 1 
_________
  1 | 41
... |...
 38 | 78
 39 | 79
 40 | 80
_________

- page 2
_________
 81 |
 82 |
... |
117 |
118 |
... |
_________

и метод работает правильно: на странице 2 нет данных для заполнения второго столбца, всего 78 элементов в списке.


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

, поэтому удалите const из ROWS_PER_PAGE и обновите его для последней страницы:

for (int i = 0; i < dt.Rows.Count; i++)
{
    DataRow dr = dt.Rows[i];
    var item = new DataForExcelExport();

    SetItemData(dr, item, true);
    if (i + ROWS_PER_PAGE < dt.Rows.Count)
    {
        SetItemData(dt.Rows[i + ROWS_PER_PAGE], item, false);
    }
    list.Add(item);
    if ((i + 1) % ROWS_PER_PAGE == 0)
    {
        i += ROWS_PER_PAGE;

        int remaining = dt.Rows.Count - (i + 1);
        if (remaining < 2 * ROWS_PER_PAGE)
        {
            ROWS_PER_PAGE = remaining / 2 + remaining % 2;
        }
    }
}
0 голосов
/ 28 октября 2019

Вы хотите, чтобы первые 40 строк были помещены в первый столбец. Но в вашем цикле все они сначала идут в первый столбец, а затем вы проверяете (i + ROWS_PER_PAGE

Если вы хотите, чтобы первые 40 перешли к первому столбцу, тогда остальные перейдут к второму столбцу,тогда вам нужно просто проверить

if (i <= ROWS_PER_PAGE)
   SetItemData(dr, item, true);
else
   SetItemData(dr, item, false);
...