【问题标题】:Horizontal and custom table in rdlc reportrdlc 报告中的水平和自定义表格
【发布时间】:2015-09-16 04:51:21
【问题描述】:

这是我的数据库(数据集)。“主进程”可以分成许多“子进程”。

例子: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

报告将与上述数据集绑定。 下图是我的报告布局。

  • 水平 Tablix(将行更改为列)
  • 如果主进程的“子进程”超过 3 个元素。写入子流程元素必须跳过下一条记录。

请帮帮我,太难了。有可能吗?

【问题讨论】:

    标签: reporting-services rdlc ssrs-tablix rdl


    【解决方案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”列表作为参数并使用表达式。

    我希望这对您有所帮助,如果有人知道如何清理我的代码,请随时编辑。

    【讨论】:

    • 非常感谢。如果子流程不超过三个子流程。会更容易吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2022-01-05
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多