最近項目裡用到treeview,原先設計的是一開始就把所有數據都加載到treeview裡,後來發現客戶的數據量實在太大,加載所有數據要2分鐘,這個是客戶沒法接受的。後來就考慮到用戶也不是一開始就要看所有的數據,用戶也是一層一層地展開,所以我們就考慮是不是可以實現以當用戶展開某個結點時才加載當前結點下面的數據。一番查找後,發現treeview有BeforeExpand事件可以實現我們的需求。
下面介紹具體的實現代碼:
1. 首先只加載各部門(結點)的信息
1: List<string> m_Departments = new List<string>() { "湖北.黃石", "湖北.鄂州", "湖北.武漢" };2: private void AddDepartMents(List<string> departments)3: {4: if (m_Root == null)5: {6: var root = departments[0].Split('.')[0];7: m_Root = new TreeNode(root);8: m_Root.Tag = root;9: treeView1.Nodes.Add(m_Root);10: }11:12:13: foreach (var department in departments)14: {15: var parent = m_Root;16: var dts = department.Split('.');17: for (int i = 1; i < dts.Length; i++)18: {19: if (!m_OrgNodeManager.ContainsKey(dts[i]))20: {21: var child = new TreeNode(dts[i],1,1);22: child.Tag = dts[i];23: child.ToolTipText = department;24: m_OrgNodeManager.Add(dts[i], child);25: parent.Nodes.Add(child);26: parent = child;27: }28: }29:30: parent.Nodes.Add("");31: }32: }
這裡要注意,每個結點加完後,要加上一個空的子結點parent.Nodes.Add(""); 不然就沒有那個加號讓你點了。
2. 實現BeforeExpand事件
1: private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)2: {3: TreeNode curentNode = e.Node;4: if (curentNode.ImageIndex == 1)5: {6: curentNode.Nodes.Clear();7: foreach (var user in m_UserManager)8: {9: if (user.Value.ToString() == curentNode.ToolTipText.ToString())10: {11: TreeNode userNode = new TreeNode(user.Key);12: curentNode.Nodes.Add(userNode);13: }14: }15: }16: }
你可以選擇分配加載,即先加載父節點類型的數據,然後點擊展開按鈕的時候再加載子節點的數據。
你應該不可能一次去加載並顯示這100萬節點吧,只在需要顯示出來的時候,去加載需要顯示的數據就行了(比如說屏幕上一次只能顯示20項數據,那只讀取創建這二十條就行了)。如果一定需要一次加載大量數據,那象多線程之類就可以考慮了,如果等待時間較長,象進度條之類也是要做的。