AfterSelect),若未載入過(Tag == null),新增一個「正在載入…」暫存節點。Thread.Sleep(5000))。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("正在載入..");
}
}
}

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