rdlc 报告中的水平和自定义 table
Horizontal and custom table in rdlc report
这是我的数据库(数据集)。"Main Process" 可以分成许多 "Sub Process"。
示例:A 是主进程 process.It 有三个子进程。(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(将行更改为列)
- 如果主进程有 "sub process" 超过 3 个元素。下一条记录必须跳过写入子流程元素。
请帮帮我,太难了。可能吗?
这真的是一个难题,我真的不认为有一个简单的方法可以解决这个问题。我会通过创建一个新的数据源来解决这个问题,您可以在其中很好地分组所有内容。
动态地做到这一点真的很难。但下面是一个示例,说明我将如何为您的示例处理此问题。有固定数量的行(在你的例子中是 4)所以我为每一行创建新列表并动态填充它们,动态地用空字符串填充空位。这样 table 将水平增长并保持 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" 列表作为参数并使用表达式。
希望对您有所帮助,如果有人知道如何清理我的代码,请随时编辑。
这是我的数据库(数据集)。"Main Process" 可以分成许多 "Sub Process"。
示例:A 是主进程 process.It 有三个子进程。(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(将行更改为列)
- 如果主进程有 "sub process" 超过 3 个元素。下一条记录必须跳过写入子流程元素。
请帮帮我,太难了。可能吗?
这真的是一个难题,我真的不认为有一个简单的方法可以解决这个问题。我会通过创建一个新的数据源来解决这个问题,您可以在其中很好地分组所有内容。
动态地做到这一点真的很难。但下面是一个示例,说明我将如何为您的示例处理此问题。有固定数量的行(在你的例子中是 4)所以我为每一行创建新列表并动态填充它们,动态地用空字符串填充空位。这样 table 将水平增长并保持 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" 列表作为参数并使用表达式。
希望对您有所帮助,如果有人知道如何清理我的代码,请随时编辑。