首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# TreeView 非同步載入子節點實作:展開時顯示「載入中…」佔位節點,背景執行緒載入完成後替換

     編輯:關於C語言

實作策略

  1. 節點展開時(AfterSelect),若未載入過(Tag == null),新增一個「正在載入…」暫存節點。
  2. 啟動背景執行緒模擬資料載入(Thread.Sleep(5000))。
  3. 載入完成,透過 Invoke 回 UI 執行緒清除暫存節點、加入真實子節點。

完整程式碼

public partial class Form1 : Form
{
    public class ThreadStartInfo
    {
        public TreeNode Node = null;
        public void LoadNode()
        {
            Thread.Sleep(5000); // 模擬耗時操作
            string[] data = { "jinjazz", "csdn", "sina", "google", "yahoo", "nba", "fifa" };
            AddNode(Node, data);
        }

        delegate void AddNodeCallback(TreeNode node, string[] str);
        void AddNode(TreeNode node, string[] str)
        {
            if (node.TreeView.FindForm().InvokeRequired)
                node.TreeView.FindForm().Invoke(new AddNodeCallback(AddNode), node, str);
            else
            {
                node.Nodes.Clear();
                foreach (string s in str) node.Nodes.Add(s);
            }
        }
    }

    public Form1() { InitializeComponent(); }

    private void Form1_Load(object sender, EventArgs e)
    {
        treeView1.Nodes.Add(new TreeNode("root"));
        treeView1.AfterSelect += treeView1_AfterSelect;
    }

    void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
    {
        if (e.Node.Tag == null || e.Node.Tag.ToString() == "")
        {
            var info = new ThreadStartInfo { Node = e.Node };
            e.Node.Tag = 1; // 標記已載入
            new Thread(info.LoadNode).Start();
            e.Node.Nodes.Add("正在載入..");
        }
    }
}

TreeView 載入中效果

此模式適用於資料庫查詢、Web Service 呼叫等耗時操作,避免 UI 凍結。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved