Горизонтальная и настраиваемая таблица в отчете rdlc

Это моя база данных (набор данных). «Основной процесс» может разделяться на множество «подпроцессов».

Пример: A - основной процесс. У него есть три подпроцесса (a1, a2 и a3).

  ----Main Process---|----SUB_PROCESS---|
          A          |        a1
          A          |        a2
          A          |        a3
          B          |        b1
          B          |        b2
          B          |        b3
          B          |        b4
          B          |        b5
          C          |        c1
          C          |        c2

Отчет будет привязан к указанному выше набору данных. На рисунке ниже показан макет моего отчета.

введите здесь описание изображения

  • Горизонтальный табликс (изменить строку на столбец)
  • Если основной процесс имеет «подпроцесс» более 3 элементов. Следующая запись должна быть пропущена для записи элементов подпроцесса.

Помогите мне пожалуйста, это так сложно. Является ли это возможным?


person Fame th    schedule 16.09.2015    source источник


Ответы (1)


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

Это действительно сложно сделать динамически. Но ниже приведен пример того, как я бы справился с этим для вашего примера. Существует фиксированное количество строк (в вашем случае 4), поэтому я создаю новые списки для каждой строки и заполняю их динамически, заполняя пустые места пустыми строками на лету. Таким образом, таблица будет расти горизонтально и сохранит 4 строки.

var row1 = new List<string>();
var row2 = new List<string>();
var row3 = new List<string>();
var row4 = new List<string>();
var rowHeaders = new List<string>();

myDataList.OrderBy(p => p.MainProcess).ThenBy(p => p.SubProcess);
foreach (var proc in myDataList)
{
    if (!rowHeaders.Contains(proc.MainProcess))
    {
        row1.Add(proc.MainProcess);
        rowHeaders.Add(proc.MainProcess);
        if (row2.Count == row1.Count - 2)
            row2.Add("");
        if (row3.Count == row1.Count - 2)
            row3.Add("");
        if (row4.Count == row1.Count - 2)
            row4.Add("");
        row2.Add(proc.SubProcess);
    }
    else
    {
        if (row2.Count == row1.Count - 1)
        {
            row2.Add(proc.SubProcess);
        }
        else
        {
            if (row3.Count == row2.Count - 1)
            {
                row3.Add(proc.SubProcess);
            }
            else
            {
                if (row4.Count == row3.Count - 1)
                {
                    row4.Add(proc.SubProcess);
                }
                else
                {
                    row1.Add(proc.SubProcess);
                }
            }
        }
    }
}


if(row2.Count < row1.Count)
    row2.Add("");
if (row3.Count < row2.Count)
    row3.Add("");
if (row4.Count < row3.Count)
    row4.Add("");

var myDataSource = new List<List<string>>();
myDataSource.Add(row1);
myDataSource.Add(row2);
myDataSource.Add(row3);
myDataSource.Add(row4);

Вероятно, есть более чистые способы фильтрации ваших данных, но этот определенно сработает. Чтобы ваш основной процесс был выделен жирным шрифтом, вы можете добавить список «rowHeader» в качестве параметра и использовать выражения.

Я надеюсь, что это поможет вам, и если кто-то знает, как очистить мой код, пожалуйста, не стесняйтесь редактировать.

person Oceans    schedule 16.09.2015
comment
Спасибо большое. Если подпроцесс имеет не более трех подпроцессов. Будет ли это легче? - person Fame th; 16.09.2015