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 }