如果維護一個老系統就總會遇到各種問題,而這次是TreeView的迴圈遍歷。對於Visual Studio2010上aspx頁面的TreeView控制元件,我感受到了什麼叫集微軟之大智慧。與二叉樹型不一樣。我解釋一下,他提供TreeNode和集合TreeNodeCollection,彼此上下級通過TreeNodeChildNodes來實現連線的。這不就是B樹結構嗎?

思考和動手

這個模型設計上很簡單(如圖所示),但是在遍歷的時候卻多了列表List的索引,而沒有Next()的迭代器,就導致用ForForeach迭代時,無法處理父Nodes子Nodes的索引切換。

編寫程式碼:

/// <summary>
/// 演示主函式
/// </summary>
/// <returns></returns>
public void main()
{
var nodes = treeView.Nodes;
// 遍歷列表
for (var i = 0; i < nodes.Count; i++)
{
NodesRecursion(nodes, i);
}
} /// <summary>
/// 遞迴遍歷TreeNodes
/// </summary>
/// <param name="x">列表</param>
/// <param name="idx">索引</param>
/// <returns></returns>
private TreeNodeCollection NodesRecursion(TreeNodeCollection x, int idx)
{
if (x == null)
return null; var y = x[idx].ChildNodes;
// 檢測是否全部遍歷,顯示全部勾選
x[idx].Checked = true; if (y.Count == 0)
{
return null;
}
else
{
// 遞迴
for (var i = 0; i < y.Count; i++)
{
NodesRecursion(y, i);
}
}
return x;
}