這真的很難,我真的不認爲有一個簡單的方法來解決這個問題。我會通過創建一個新的數據源來解決這個問題,在這個新的數據源中你可以很好地組合一切。
動態地做到這一點確實很難。但下面是我如何處理這個例子的例子。有固定數量的行(在你的情況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」列表作爲參數並使用表達式。
我希望這對你有任何幫助,如果有人知道如何清理我的代碼,請隨時編輯。
非常感謝。如果子過程不超過三個子過程。會更容易嗎? –