最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# TreeView 控件的詳解與應(yīng)用小結(jié)

 更新時間:2026年01月30日 10:31:29   作者:工業(yè)程序猿老趙  
本文主要介紹了C# TreeView 控件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、TreeView 控件核心概念

TreeView 是 C# WinForm/WPF 中用于以樹形層級結(jié)構(gòu)展示數(shù)據(jù)的控件,其核心組成單元有兩個:
1、TreeNode(樹節(jié)點):TreeView 的最小展示單元,用于承載單個數(shù)據(jù)項,支持包含文本、圖標、自定義數(shù)據(jù)等內(nèi)容。
2、層級結(jié)構(gòu):TreeNode 支持嵌套(節(jié)點可以包含子節(jié)點),形成 “根節(jié)點 - 子節(jié)點 - 葉子節(jié)點” 的層級關(guān)系,根節(jié)點是樹形結(jié)構(gòu)的頂層節(jié)點(可多個),葉子節(jié)點是沒有子節(jié)點的末端節(jié)點。
TreeView 常見應(yīng)用場景:文件目錄瀏覽、系統(tǒng)權(quán)限結(jié)構(gòu)展示、菜單導(dǎo)航、數(shù)據(jù)分類層級展示等。

二、基礎(chǔ)操作(WinForm 為例,最常用場景)

1. 環(huán)境準備

在 Visual Studio 中創(chuàng)建 WinForm 項目,從 “工具箱” 中拖拽 TreeView 控件到窗體上(默認命名為 treeView1),可通過屬性窗口設(shè)置其外觀(如大小、字體、背景色等)。

2. 核心:添加節(jié)點(TreeNode)

添加節(jié)點有設(shè)計時和運行時兩種方式,運行時添加更具靈活性,是實際開發(fā)的主流方式。

  • (1)設(shè)計時添加
    選中 TreeView 控件,在屬性窗口中找到 Nodes 屬性,點擊右側(cè) “…” 按鈕,打開 “TreeNode 編輯器”,通過 “添加根”“添加子節(jié)點” 按鈕創(chuàng)建層級結(jié)構(gòu),設(shè)置節(jié)點的 Text(顯示文本)、Name(唯一標識)等屬性,點擊 “確定” 即可完成靜態(tài)節(jié)點添加。
  • (2)運行時添加(3 種常用方式)

方式 1:直接創(chuàng)建 TreeNode 并添加(單個 / 少量節(jié)點)

// 1. 添加根節(jié)點
TreeNode rootNode1 = new TreeNode("計算機"); // 初始化節(jié)點,指定顯示文本
treeView1.Nodes.Add(rootNode1); // 將根節(jié)點添加到 TreeView 的節(jié)點集合中

// 2. 給根節(jié)點添加子節(jié)點
TreeNode childNode1 = new TreeNode("本地磁盤 (C:)");
TreeNode childNode2 = new TreeNode("本地磁盤 (D:)");
rootNode1.Nodes.Add(childNode1); // 子節(jié)點添加到父節(jié)點的 Nodes 集合中
rootNode1.Nodes.Add(childNode2);

// 3. 嵌套添加孫子節(jié)點
TreeNode grandChildNode1 = new TreeNode("Windows 文件夾");
childNode1.Nodes.Add(grandChildNode1);

方式 2:批量添加節(jié)點(適合大量節(jié)點)

// 先創(chuàng)建節(jié)點數(shù)組,再批量添加
TreeNode[] rootNodes = new TreeNode[]
{
    new TreeNode("我的文檔"),
    new TreeNode("我的圖片"),
    new TreeNode("我的音樂")
};
treeView1.Nodes.AddRange(rootNodes); // 批量添加根節(jié)點

// 給“我的文檔”批量添加子節(jié)點
TreeNode[] docChildNodes = new TreeNode[]
{
    new TreeNode("工作文檔"),
    new TreeNode("個人文檔"),
    new TreeNode("臨時文檔")
};
treeView1.Nodes[1].Nodes.AddRange(docChildNodes); // 通過索引獲取根節(jié)點,再添加子節(jié)點數(shù)組

方式 3:簡化寫法(直接傳入文本添加)

// 直接添加根節(jié)點(無需顯式創(chuàng)建 TreeNode 實例)
treeView1.Nodes.Add("網(wǎng)絡(luò)鄰居");

// 給指定根節(jié)點添加子節(jié)點(鏈式寫法)
treeView1.Nodes[3].Nodes.Add("無線網(wǎng)絡(luò)");
treeView1.Nodes[3].Nodes.Add("有線網(wǎng)絡(luò)");

3. 節(jié)點的常用操作(修改、刪除、查找、展開 / 折疊)

  • (1)修改節(jié)點
// 1. 通過索引查找節(jié)點并修改文本
treeView1.Nodes[0].Text = "我的電腦(修改后)";

// 2. 通過節(jié)點名稱查找并修改(設(shè)計時或創(chuàng)建時指定 Name 屬性)
TreeNode targetNode = treeView1.Nodes.Find("nodeDoc", true)[0]; // true 表示遞歸查找所有子節(jié)點
targetNode.Text = "我的文檔(修改后)";

// 3. 設(shè)置節(jié)點附加數(shù)據(jù)(Tag 屬性,可存儲任意對象)
childNode1.Tag = new { DiskType = "系統(tǒng)盤", Capacity = "500GB" };
  • (2)刪除節(jié)點
// 1. 刪除選中的節(jié)點
if (treeView1.SelectedNode != null)
{
    treeView1.SelectedNode.Remove();
}

// 2. 刪除指定根節(jié)點
treeView1.Nodes.RemoveAt(3); // 刪除索引為 3 的根節(jié)點

// 3. 清空所有節(jié)點
treeView1.Nodes.Clear();
  • (3)展開 / 折疊節(jié)點
// 1. 展開指定節(jié)點(包含所有子節(jié)點)
treeView1.Nodes[0].ExpandAll();

// 2. 折疊指定節(jié)點(包含所有子節(jié)點)
treeView1.Nodes[0].Collapse();

// 3. 切換節(jié)點的展開/折疊狀態(tài)(點擊節(jié)點時常用)
if (treeView1.SelectedNode != null)
{
    treeView1.SelectedNode.Toggle();
}

// 4. 展開所有根節(jié)點(不展開子節(jié)點)
foreach (TreeNode node in treeView1.Nodes)
{
    node.Expand();
}

三、關(guān)鍵事件:響應(yīng)節(jié)點交互

TreeView 控件的核心交互事件用于捕獲用戶操作,最常用的有以下兩個:

  1. AfterSelect 事件(節(jié)點選中后觸發(fā))
    當用戶點擊(或通過鍵盤切換)選中某個節(jié)點時觸發(fā),常用于獲取選中節(jié)點的信息并執(zhí)行后續(xù)邏輯。
    事件綁定與實現(xiàn)
// 方式1:通過窗體設(shè)計器綁定(選中 TreeView,雙擊屬性窗口中的 AfterSelect 事件)
// 方式2:運行時手動綁定(窗體構(gòu)造函數(shù)中)
public Form1()
{
    InitializeComponent();
    treeView1.AfterSelect += new TreeViewEventHandler(treeView1_AfterSelect);
}

// AfterSelect 事件處理方法
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    // e.Node 表示當前選中的節(jié)點
    if (e.Node != null)
    {
        // 顯示選中節(jié)點的信息
        string nodeInfo = $"選中節(jié)點:{e.Node.Text}\n節(jié)點層級:{GetNodeLevel(e.Node)}";
        if (e.Node.Tag != null)
        {
            nodeInfo += $"\n附加數(shù)據(jù):{e.Node.Tag.ToString()}";
        }
        MessageBox.Show(nodeInfo);
    }
}

// 輔助方法:獲取節(jié)點層級(根節(jié)點層級為 0)
private int GetNodeLevel(TreeNode node)
{
    int level = 0;
    TreeNode currentNode = node;
    while (currentNode.Parent != null)
    {
        level++;
        currentNode = currentNode.Parent;
    }
    return level;
}

2. NodeMouseClick 事件(節(jié)點鼠標點擊觸發(fā))
當用戶用鼠標點擊節(jié)點時觸發(fā),可區(qū)分點擊的鼠標按鍵(左鍵、右鍵),常用于實現(xiàn)右鍵菜單等功能。
事件實現(xiàn)(右鍵菜單示例)

// 窗體構(gòu)造函數(shù)中綁定事件
public Form1()
{
    InitializeComponent();
    treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler(treeView1_NodeMouseClick);
}

// NodeMouseClick 事件處理方法
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    // 右鍵點擊節(jié)點時顯示自定義菜單
    if (e.Button == MouseButtons.Right)
    {
        // 選中當前點擊的節(jié)點(避免右鍵點擊未選中節(jié)點)
        treeView1.SelectedNode = e.Node;

        // 創(chuàng)建右鍵菜單
        ContextMenuStrip contextMenu = new ContextMenuStrip();
        contextMenu.Items.Add("查看節(jié)點信息");
        contextMenu.Items.Add("-"); // 分隔線
        contextMenu.Items.Add("修改節(jié)點文本");
        contextMenu.Items.Add("刪除節(jié)點");

        // 菜單點擊事件
        contextMenu.Items[0].Click += (s, args) =>
        {
            MessageBox.Show($"節(jié)點信息:{e.Node.Text}");
        };
        contextMenu.Items[2].Click += (s, args) =>
        {
            e.Node.Text = "修改后的節(jié)點(右鍵菜單)";
        };
        contextMenu.Items[3].Click += (s, args) =>
        {
            e.Node.Remove();
        };

        // 顯示右鍵菜單
        contextMenu.Show(treeView1, e.Location);
    }
}

四、高級應(yīng)用:動態(tài)加載樹形數(shù)據(jù)(懶加載)

在實際開發(fā)中,若樹形數(shù)據(jù)量較大(如文件目錄、海量分類數(shù)據(jù)),一次性加載所有節(jié)點會導(dǎo)致界面卡頓,此時常用懶加載(按需加載):僅加載根節(jié)點,當用戶展開某個節(jié)點時,再動態(tài)加載其下的子節(jié)點。
實現(xiàn)思路

  • 1、初始化時僅加載根節(jié)點,并給每個根節(jié)點標記 “未加載子節(jié)點”(可通過 Tag 屬性或自定義節(jié)點擴展)。
  • 2、綁定 TreeView 的 BeforeExpand 事件(節(jié)點展開前觸發(fā))。
  • 3、在事件中判斷當前節(jié)點是否已加載子節(jié)點,若未加載則動態(tài)獲取數(shù)據(jù)并添加子節(jié)點,同時標記為 “已加載”。
    代碼實現(xiàn)(模擬文件目錄懶加載)
// 窗體構(gòu)造函數(shù):初始化根節(jié)點
public Form1()
{
    InitializeComponent();
    treeView1.BeforeExpand += new TreeViewCancelEventHandler(treeView1_BeforeExpand);
    
    // 初始化根節(jié)點(模擬“我的電腦”,標記為未加載子節(jié)點)
    TreeNode rootNode = new TreeNode("我的電腦");
    rootNode.Tag = false; // false = 未加載子節(jié)點,true = 已加載子節(jié)點
    treeView1.Nodes.Add(rootNode);
}

// BeforeExpand 事件:懶加載子節(jié)點
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
    TreeNode currentNode = e.Node;
    // 判斷是否已加載子節(jié)點(通過 Tag 屬性判斷)
    if (currentNode.Tag != null && (bool)currentNode.Tag == false)
    {
        // 清空臨時節(jié)點(若有),避免重復(fù)加載
        currentNode.Nodes.Clear();

        // 模擬動態(tài)獲取子節(jié)點數(shù)據(jù)(實際開發(fā)中可替換為數(shù)據(jù)庫查詢、文件目錄讀取等)
        List<string> childNodeNames = GetChildNodeData(currentNode.Text);

        // 添加子節(jié)點,并標記為未加載(后續(xù)可繼續(xù)展開加載孫子節(jié)點)
        foreach (string nodeName in childNodeNames)
        {
            TreeNode childNode = new TreeNode(nodeName);
            childNode.Tag = false; // 子節(jié)點默認未加載孫子節(jié)點
            currentNode.Nodes.Add(childNode);
        }

        // 標記當前節(jié)點為已加載,避免重復(fù)觸發(fā)加載
        currentNode.Tag = true;
    }
}

// 模擬獲取子節(jié)點數(shù)據(jù)的方法
private List<string> GetChildNodeData(string parentNodeText)
{
    List<string> childNodes = new List<string>();
    switch (parentNodeText)
    {
        case "我的電腦":
            childNodes.AddRange(new string[] { "本地磁盤 (C:)", "本地磁盤 (D:)", "本地磁盤 (E:)" });
            break;
        case "本地磁盤 (C:)":
            childNodes.AddRange(new string[] { "Windows", "Program Files", "Users" });
            break;
        case "本地磁盤 (D:)":
            childNodes.AddRange(new string[] { "工作文件", "娛樂視頻", "備份數(shù)據(jù)" });
            break;
        case "本地磁盤 (E:)":
            childNodes.AddRange(new string[] { "照片", "音樂", "軟件安裝包" });
            break;
        default:
            childNodes.Add("空文件夾");
            break;
    }
    return childNodes;
}

五、補充說明

  • 1、WPF 中的 TreeView:WinForm 的 TreeView 偏向傳統(tǒng)桌面應(yīng)用,WPF 中的 TreeView 支持數(shù)據(jù)綁定(ItemsSource)、模板自定義(DataTemplate),更適合現(xiàn)代化界面,核心思想(層級結(jié)構(gòu)、節(jié)點操作)與 WinForm 一致,但實現(xiàn)方式更靈活。
  • 2、節(jié)點圖標設(shè)置:可通過 ImageList 控件配合 TreeView 的 ImageList、ImageIndex、SelectedImageIndex 屬性為節(jié)點設(shè)置普通狀態(tài)和選中狀態(tài)的圖標。
  • 3、性能優(yōu)化:處理大量節(jié)點時,可先調(diào)用 treeView1.BeginUpdate() 暫停界面刷新,操作完成后調(diào)用 treeView1.EndUpdate() 恢復(fù)刷新,避免界面閃爍。

六、總結(jié)

  • 1、TreeView 核心是TreeNode 節(jié)點的層級管理,節(jié)點的添加、刪除、修改是基礎(chǔ)操作,通過 Nodes 集合實現(xiàn)。
  • 2、常用交互依賴 AfterSelect(選中)和 NodeMouseClick(鼠標點擊)事件,可滿足大部分交互場景。
  • 3、大數(shù)據(jù)量場景下,** 懶加載(BeforeExpand 事件按需加載)** 是提升性能的關(guān)鍵。
  • 4、開發(fā)中可通過 Tag 屬性存儲節(jié)點附加數(shù)據(jù),通過 BeginUpdate()/EndUpdate() 優(yōu)化界面刷新性能。

到此這篇關(guān)于C# TreeView 控件的詳解與應(yīng)用小結(jié)的文章就介紹到這了,更多相關(guān)C# TreeView 控件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#微信公眾號開發(fā)之使用MessageHandler簡化消息處理流程

    C#微信公眾號開發(fā)之使用MessageHandler簡化消息處理流程

    這篇文章介紹了C#微信公眾號開發(fā)之使用MessageHandler簡化消息處理流程,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#實現(xiàn)對字符串中特定詞出現(xiàn)次數(shù)的計數(shù)過程

    C#實現(xiàn)對字符串中特定詞出現(xiàn)次數(shù)的計數(shù)過程

    LINQ(Language-Integrated Query)是C#和VB.NET中強大的查詢語言,它可以用來查詢集合、SQL數(shù)據(jù)庫、XML文檔等,在C#中,我們可以使用LINQ來簡化對字符串中特定單詞出現(xiàn)次數(shù)的計數(shù)過程,需要的朋友可以參考下
    2024-08-08
  • 利用C#開發(fā)瀏覽器擴展的全過程記錄

    利用C#開發(fā)瀏覽器擴展的全過程記錄

    做web開發(fā)的同學(xué),經(jīng)常會用到各種chrome瀏覽器插件,那么我們寄幾怎么開發(fā)一個插件呢(其實是瀏覽器擴展)?這篇文章主要給大家介紹了關(guān)于利用C#開發(fā)瀏覽器擴展的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C#檢查字符串是否是合法URL地址的方法

    C#檢查字符串是否是合法URL地址的方法

    這篇文章主要介紹了C#檢查字符串是否是合法URL地址的方法,涉及C#字符串判斷的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則的示例詳解

    C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則的示例詳解

    在面向?qū)ο缶幊讨?,SOLID?是五個設(shè)計原則的首字母縮寫,旨在使軟件設(shè)計更易于理解、靈活和可維護。本文將通過實例詳細講講C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則,需要的可以參考一下
    2022-07-07
  • C# 設(shè)計模式系列教程-策略模式

    C# 設(shè)計模式系列教程-策略模式

    策略模式是一種定義一系列算法的方法,從概念上來看,所有算法完成的都是相同的工作,只是實現(xiàn)不同,它可以以相同的方式調(diào)用所有的算法,減少了各種算法類與使用算法類之間的耦合。
    2016-06-06
  • C#驗證碼的創(chuàng)建與使用示例

    C#驗證碼的創(chuàng)建與使用示例

    這篇文章主要介紹了C#驗證碼的創(chuàng)建與使用方法,結(jié)合實例形式較為詳細的分析了C#驗證碼的創(chuàng)建、驗證等操作步驟與相關(guān)技巧,需要的朋友可以參考下
    2017-01-01
  • C#使用Protocol Buffer(ProtoBuf)進行Unity中的Socket通信

    C#使用Protocol Buffer(ProtoBuf)進行Unity中的Socket通信

    這篇文章主要介紹了C#使用Protocol Buffer(ProtoBuf)進行Unity的Socket通信的實例,Protocol Buffer是Google開發(fā)的數(shù)據(jù)格式,也是除了XML和JSON之外人氣第三高的^^需要的朋友可以參考下
    2016-04-04
  • C#?PictureBox控件方法參數(shù)及圖片刪除重命名上傳詳解

    C#?PictureBox控件方法參數(shù)及圖片刪除重命名上傳詳解

    這篇文章主要為大家介紹了C#?PictureBox控件方法參數(shù)及圖片刪除重命名上傳示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 使用WPF在Windows實現(xiàn)任務(wù)欄縮略圖效果

    使用WPF在Windows實現(xiàn)任務(wù)欄縮略圖效果

    這篇文章主要為大家詳細介紹了如何使用WPF在Windows實現(xiàn)任務(wù)欄縮略圖效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-06-06

最新評論

沙湾县| 石城县| 龙江县| 宝鸡市| 曲阳县| 广灵县| 子长县| 麻江县| 荆州市| 石景山区| 崇信县| 两当县| 革吉县| 江口县| 海安县| 封开县| 屏边| 汶上县| 涞源县| 湖口县| 沙坪坝区| 调兵山市| 拉萨市| 永丰县| 温泉县| 南澳县| 阳城县| 淳安县| 禹城市| 宜都市| 太康县| 隆昌县| 会东县| 蓬溪县| 大渡口区| 锡林浩特市| 昌邑市| 唐河县| 博乐市| 阆中市| 增城市|