這篇內容對剛接觸treeList的程序員來說,會有一定的幫助。
以下會以一個小案例來講解treeList的一些屬性方法及事件
這是程序的窗體,frmTableMaintenance為窗體名,而groupControl1是一個分組控件,添加和修改都是 用同一個分組,也就是說,不管是添加還是修改,用的都是同一個頁面,而button跟隨操作的變化而變化
首先,加載樹,即將數據綁定到treeList中
1 /// <summary> 2 /// 加載樹 3 ///tl_TableMaintain是treeList的名稱
///對於綁定數據,treeList有自帶的,可以不用自己去遞歸。直接指定KeyFieldName(主鍵),ParentFieldName(父鍵),以及tag值。 4 /// </summary> 5 public void LoadTree() 6 { 7 try 8 { 9 this.tl_TableMaintain.Nodes.Clear();//清空所有節點,以便重新加載 10 11 ResultBase _arryTableName = Global.Get("System/GetTableMaintain"); 12 13 if (_arryTableName != null) 14 { 15 _snList = (List<erp_dev_table>)JsonConvert.DeserializeObject(_arryTableName.Result, typeof(List<erp_dev_table>));//數據源 snList ,這里獲取數據源的方式可自由定義 16 17 } 18 TreeListNode node = tl_TableMaintain.AppendNode(null, -1); 19 node.SetValue(treeListColumn1, "表結構維護"); 20 LoadTreeCtrl(node, "-1"); 21 TreeListProperty(tl_TableMaintain);//調用方法,設置屬性 22 } 23 catch (Exception ex) 24 {} 25 } 26 27 28 private void LoadTreeCtrl(TreeListNode pnode, string parentkey) 29 { 30 try 31 { 32 int index = 0; 33 List<erp_dev_table> dv = _snList.Where(o => o.parent_key.Trim() == parentkey.Trim()).ToList();//根據父級id獲取子節點循環加載 34 foreach (erp_dev_table rv in dv) 35 { 36 TreeListNode node = pnode.TreeList.AppendNode(rv.table_key, pnode); 37 node.SetValue(0, rv.table_name_english); 38 node.Tag = rv; 39 LoadTreeCtrl(node, Command.Instance.Getstring(rv.table_key)); 40 } 41 } 42 catch (Exception ex) 43 { 44 } 45 } 46 47 48 49 50 51 52 /// <summary> 53 /// 設置treeList的屬性 54 /// </summary> 55 /// <param name="tl"></param> 56 private void TreeListProperty(TreeList tl) 57 { 58 tl.OptionsView.ShowColumns = false;//是否顯示選中的行 59 tl.OptionsBehavior.Editable = false;//不可編輯 60 tl.OptionsView.ShowHorzLines = false;//OptionsView提供對樹狀列表的顯示選項,設置水平線是否顯示 61 tl.OptionsView.ShowIndicator = false;//節點的指示面板是否顯示 62 tl.OptionsView.ShowVertLines = false;//垂直線條是否顯示 63 //設置treeList的折疊樣式為 + - 號 64 tl.LookAndFeel.UseDefaultLookAndFeel = false; 65 tl.LookAndFeel.UseWindowsXPTheme = true; 66 tl.OptionsSelection.InvertSelection = true;//聚焦的樣式是否只適用於聚焦細胞或所有細胞除了聚焦對象,失去焦點后 67 } 68 69
然后,單擊或雙擊樹節點時,加載該節點對象的詳細信息,如圖:
如果樹里面的節點 較多,可以采取查詢的方法定位到該節點上。如圖中的查詢框一樣,當點擊查詢時,查看數據庫中是否存在該對象,若存在,則將焦點定位到該節點上,反之,則提示輸入的對象不存在!如圖:
代碼如下:
1 /// <summary> 2 /// 點擊查詢,查出相應的 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void btn_selectTName_Click(object sender, EventArgs e) 7 { 8 tName = txt_name.Text.Trim(); 9 if (!String.IsNullOrEmpty(tName)) 10 { 11 12 GetTMByName(); 13 btn_saveOrUpdate.Text = "修改"; 14 } 15 else 16 { 17 Global.ShowMeg(Command.MsgType.Warning, "請填寫您要查詢的表名"); 18 this.txt_name.Focus(); 19 } 20 } 21 22 /// <summary> 23 /// 迭代找到節點 24 /// </summary> 25 /// <param name="node"></param> 26 /// <param name="text"></param> 27 /// <returns></returns> 28 private TreeListNode forNode(TreeListNode node, string text) 29 { 30 erp_dev_table tableOne = (erp_dev_table)node.Tag; 31 if (tableOne!=null) 32 { 33 if (tableOne.table_name_english==text) 34 { 35 return node; 36 } 37 38 } 39 // 循環父節點下的所有子節點 40 foreach (TreeListNode n in node.Nodes) 41 { 42 43 TreeListNode rn = forNode(n, text); 44 if (rn != null) 45 return rn; 46 47 } 48 return null; 49 } 50 51 52 public void GetTMByName() 53 { 54 TreeListNode node = forNode(this.tl_TableMaintain.Nodes[0], tName); 55 if (node == null) 56 { 57 Global.ShowMeg(Command.MsgType.Warning, "您輸入有誤,當前實體不存在"); 58 return; 59 } 60 61 if (node.ParentNode.Expanded == false) 62 { 63 node.ExpandAll(); 64 65 } 66 this.tl_TableMaintain.FocusedNode = node; 67 BangDing(); 68 69 70 } 71 public void BangDing()
{
_currNode = (erp_dev_table)tl_TableMaintain.FocusedNode.Tag;
erp_dev_table tb = _currNode;
txt_chinaName.Text = tb.table_name_chain;
txt_englishName.Text = tb.table_name_english;
grp_tableDesc.Text = "當前節點為 "+tb.table_name_english;
if (tb.table_type == 1)
{
rd_directory.Checked = true;
}
else if (tb.table_type == 2)
{
rb_table.Checked = true;
}
txt_remark.Text = tb.table_memo;
med_desc.Text = tb.table_descr;
grp_tableDesc.Show();
}