2015-09-16 2 views
1

Это моя база данных (Dataset). «Основной процесс» может разделяться на многие «Подпроцессы».Горизонтальная и пользовательская таблица в отчете rdlc

Пример: А основной process.It-х есть три суб процесса (а1, а2 и а3)

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

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

enter image description here

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

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

ответ

3

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

Это действительно сложно сделать так, чтобы это происходило динамически. Но ниже приведен пример того, как я буду обрабатывать это для вашего примера. Есть фиксированное количество строк (в вашем случае 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» в качестве параметра и использовать выражения.

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

+0

Спасибо вам большое. Если подпроцесс имеет не более трех подпроцессов. Будет ли проще? –

Смежные вопросы