1 树形控件添加到动态表单(或单据等)界面上之后,通过重载界面插件的如下两个事件实现功能:
2 1. TreeLoadData 事件:在此事件中构建树节点
3 2. TreeNodeClick 事件:在此事件中响应用户点击树节点动作
4
5 如下代码演示如何在基础资料的列表界面,如何自行构建左边的分组树节点;用户点击分组之后,如何过滤基础资料数据:
6
7 using System;
8 using System.Collections.Generic;
9 using System.Linq;
10 using System.Text;
11 using System.ComponentModel;
12 using Kingdee.BOS;
13 using Kingdee.BOS.Util;
14 using Kingdee.BOS.Core;
15 using Kingdee.BOS.Core.DynamicForm.PlugIn;
16 using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
17 using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
18 using Kingdee.BOS.Core.List;
19 using Kingdee.BOS.Core.List.PlugIn;
20 using Kingdee.BOS.Core.List.PlugIn.Args;
21 using Kingdee.BOS.Core.Metadata;
22 using Kingdee.BOS.Orm.DataEntity;
23 namespace JDSample.FormPlugIn.BaseData
24 {
25 /// <summary>
26 /// 多层次基础资料列表插件
27 /// </summary>
28 /// <remarks>
29 /// 演示用基础资料:
30 /// FormId : 08441f27-444c-43ee-bed9-8498a1ff066c
31 /// 基类:1.1 不受组织控制基础资料模板(BOS_NoOrgControlBDModel)
32 /// 名称:资料类别
33 /// 包含的字段:
34 /// 1. 上级资料 F_JD_ParentId
35 /// 2. 编码 FNumber
36 /// 3. 名称 FName
37 /// 4. 完整父节点内码 F_JD_FullParentId (由各级父节点内码组成,如(.1001.1002.1003,以便根据当前节点,快速找出所有下级节点)
38 /// </remarks>
39 [Description("多层次基础资料列表插件")]
40 public class MulLevelBaseDataList : AbstractListPlugIn
41 {
42 private TreeNode _groupRootNode = null;
43 /// <summary>
44 /// 界面请求构建树节点事件;拦截此事件,自行构建树节点
45 /// </summary>
46 /// <param name="e"></param>
47 public override void TreeLoadData(TreeLoadDataArgs e)
48 {
49 TreeView tv = this.View.GetControl<TreeView>("FGroupTreeView");
50 var parentNode = BuildTreeNode(this.Context, this.View.BillBusinessInfo);
51 tv.SetRootNode(parentNode);
52 tv.SetExpanded(true);
53 // 略过系统预置取分组树的功能
54 e.Cancel = true;
55 }
56 /// <summary>
57 /// 用户点击树节点事件:
58 /// 拦截此事件,根据用户所选节点,设置过滤条件,筛选列表数据
59 /// </summary>
60 /// <param name="e"></param>
61 public override void TreeNodeClick(TreeNodeArgs e)
62 {
63 TreeViewFilterParameter filterParameter = ((ITreeListModel)this.Model).TreeViewFilterParameter as TreeViewFilterParameter;
64 filterParameter.FilterString = string.Empty; // 分组过滤条件
65 filterParameter.IgnoreSelectedGroupIds = false; // 是否忽略默认的分组过滤处理
66 if (e.NodeId == "0")
67 {
68 // 点击根节点,无需设置分组过滤条件
69 return;
70 }
71 // 拼接分组过滤条件:资料类别 = 本节点,以及本节点的全部下级节点
72 string filter = string.Format(" (FID = {0} OR F_JD_FullParentId LIKE '%.{0}.%') ", e.NodeId);
73 // 采用二开设置的分组过滤条件,忽略系统默认的分组过滤
74 filterParameter.FilterString = filter;
75 filterParameter.IgnoreSelectedGroupIds = true;
76 }
77 public static TreeNode BuildTreeNode(Context ctx, BusinessInfo groupInfo)
78 {
79 // 构建根目录
80 TreeNode rootNode = new TreeNode();
81 rootNode.id = "0";
82 rootNode.parentid = "0";
83 rootNode.text = "全部";
84 // 读取全部资料分类数据
85 List<SelectorItemInfo> selectorList = new List<SelectorItemInfo>();
86 selectorList.Add(new SelectorItemInfo("FID"));
87 selectorList.Add(new SelectorItemInfo("F_JD_ParentId"));
88 selectorList.Add(new SelectorItemInfo("FNumber"));
89 selectorList.Add(new SelectorItemInfo("FName"));
90 var infoGroups = Kingdee.BOS.ServiceHelper.BusinessDataServiceHelper.Load(
91 ctx,
92 groupInfo,
93 selectorList,
94 OQLFilter.CreateHeadEntityFilter(""));
95
96 if (infoGroups == null || infoGroups.Length == 0) return rootNode;
97 // 把各资料分类,转换为树节点,并放在字典中
98 Dictionary<string, TreeNode> dctNodes = new Dictionary<string, TreeNode>();
99 foreach (var infoGroup in infoGroups)
100 {
101 long id = Convert.ToInt64(infoGroup["Id"]);
102 long parentId = Convert.ToInt64(infoGroup["F_JD_ParentId_Id"]);
103 string number = Convert.ToString(infoGroup["Number"]);
104 string name = Convert.ToString(infoGroup["Name"]);
105 TreeNode node = new TreeNode()
106 {
107 id = id.ToString(),
108 text = string.Format("{0}({1})", name, number),
109 parentid = parentId.ToString(),
110 };
111 dctNodes.Add(id.ToString(), node);
112 }
113 // 把各节点,放在其父节点下面
114 foreach (var item in dctNodes)
115 {
116 TreeNode node = item.Value;
117 if (node.parentid == "0")
118 {
119 rootNode.children.Add(node);
120 }
121 else if (dctNodes.Keys.Contains(node.parentid))
122 {
123 dctNodes[node.parentid].children.Add(node);
124 }
125 }
126 return rootNode;
127 }
128 }
129 }