首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 樹形視圖遞歸加載目錄:缺少文件顯示邏輯與節點展開機制

     編輯:程式設計綜合問答

代碼缺陷分析

  • 僅遞歸添加子目錄節點:`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());
    }
}

關鍵改進點

  1. 使用 `Tag` 屬性存儲完整路徑,避免路徑拼接錯誤。
  2. 佔位符節點實現**延遲加載** (按需讀取),解決深度限制與啟動緩慢。
  3. `BeforeExpand` 事件替代 `NodeMouseDoubleClick`,符合樹形控件標準交互。< /li>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved