标签:
这篇内容对刚接触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();
}
标签:
原文地址:http://www.cnblogs.com/liuyun-Jin/p/4512483.html