代碼缺陷分析
- 僅遞歸添加子目錄節點:`ListDirs` 只調用 `Directory.GetDirectories` 並創建 `TreeNode`,**完全沒有處理文件** (`Directory.GetFiles`)。
- 雙擊事件邏輯錯誤:`tvDir_NodeMouseDoubleClick` 調用 `ListDirs(e.Node, txtPath.Text.Trim())`,但 `txtPath` 未同步更新為當前節點完整路徑。
- 遞歸深度限制硬編碼:`nDirLevel > 4` 返回,實際應由 `TreeView` 節點展開狀態控制 (虛擬模式/延遲加載)。< /li>
修正版核心邏輯
private void ListDirs(TreeNode parentNode, string path) {
try {
// 1. 加載子目錄
foreach (string dir in Directory.GetDirectories(path)) {
TreeNode node = new TreeNode(Path.GetFileName(dir));
node.Tag = dir; // 存儲完整路徑
node.Nodes.Add(""); // 佔位符,觸發 + 號
parentNode.Nodes.Add(node);
}
// 2. 加載文件 (圖標區分)
foreach (string file in Directory.GetFiles(path)) {
TreeNode node = new TreeNode(Path.GetFileName(file));
node.Tag = file;
node.ImageIndex = node.SelectedImageIndex = 1; // 文件圖標
parentNode.Nodes.Add(node);
}
} catch (UnauthorizedAccessException) { /* 忽略無權限目錄 */ }
}
// 雙擊/展開事件:延遲加載
private void tvDir_BeforeExpand(object sender, TreeViewCancelEventArgs e) {
if (e.Node.Nodes.Count == 1 && e.Node.Nodes[0].Text == "") { // 僅有佔位符
e.Node.Nodes.Clear();
ListDirs(e.Node, e.Node.Tag.ToString());
}
}
關鍵改進點
- 使用 `Tag` 屬性存儲完整路徑,避免路徑拼接錯誤。
- 佔位符節點實現**延遲加載** (按需讀取),解決深度限制與啟動緩慢。
- `BeforeExpand` 事件替代 `NodeMouseDoubleClick`,符合樹形控件標準交互。< /li>