这篇内容对刚接触treeList的程序员来说,会有一定的帮助。
以下会以一个小案例来讲解treeList的一些属性方法及事件
这是程序的窗体,frmTableMaintenance为窗体名,而groupControl1是一个分组控件,添加和修改都是 用同一个分组,也就是说,不管是添加还是修改,用的都是同一个页面,而button跟随操作的变化而变化
首先,加载树,即将数据绑定到treeList中
1 ///
2 /// 加载树
3 ///tl_TableMaintain是treeList的名称 ///对于绑定数据,treeList有自带的,可以不用自己去递归。直接指定KeyFieldName(主键),ParentFieldName(父键),以及tag值。
4 ///
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)JsonConvert.DeserializeObject(_arryTableName.Result, typeof(List));//数据源 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 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 ///
53 /// 设置treeList的属性
54 ///
55 ///
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 ///
2 /// 点击查询,查出相应的
3 ///
4 ///
5 ///
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 ///
23 /// 迭代找到节点
24 ///
25 ///
26 ///
27 ///
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(); }
|