这真的很难,我真的不认为有一个简单的方法来解决这个问题。我会通过创建一个新的数据源来解决这个问题,在这个新的数据源中你可以很好地组合一切。
动态地做到这一点确实很难。但下面是我如何处理这个例子的例子。有固定数量的行(在你的情况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”列表作为参数并使用表达式。
我希望这对你有任何帮助,如果有人知道如何清理我的代码,请随时编辑。
非常感谢。如果子过程不超过三个子过程。会更容易吗? –