antv G6 分层树怎么将图片插入作为树节点?

2020-08-15 社会 474阅读
  • 你看下这个代码能不能套用  不是完全复制哈

  • using System;

  • using System.Collections.Generic;

  • using System.Linq;

  • using System.Text;

  • using System.ComponentModel;

  • using Kingdee.BOS;

  • using Kingdee.BOS.Util;

  • using Kingdee.BOS.Core;

  • using Kingdee.BOS.Core.DynamicForm;

  • using Kingdee.BOS.Core.DynamicForm.PlugIn;

  • using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

  • using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;

  • using Kingdee.BOS.Core.Metadata;

  • namespace JDSample.FormPlugIn.DynamicForm

  • {

  • /// 

  • /// 分批分层加载树节点

  • /// 

  • /// 

  • /// 案例背景:

  • /// 界面上使用树控件,需显示大量的节点;

  • /// 如果一次性加载到客户端,显示渲染会非常慢;

  • /// 因此,需要分层、分批下载

  • ///

  • /// 案例说明:

  • /// 新增一个动态表单,挂上本插件,并在界面有一个树控件 F_JD_TreeView;

  • /// 界面初始化时,仅加载第一层节点;

  • /// 用户点击节点时,才加载其包含的子节点,而且每次最多加载10个;

  • /// 单层超过10个节点,通过"点击加载更多..."节点,分批下载

  • /// 

  • [Description("分批分层加载树节点")]

  • public class S160107TreeEdit : AbstractDynamicFormPlugIn

  • {

  • /// 

  • /// 本地变量,存储需加载到前端的所有节点信息,以及其是否已经加载标志

  • /// 

  • private Dictionary _dctNodes = new Dictionary();

  • /// 

  • /// 本地变量,存储已经被加载过的父节点Id,避免重复搜索其子节点,浪费时间

  • /// 

  • private HashSet _loadedNodeIds = new HashSet();

  • /// 

  • /// 界面初始化结束,触发此事件,通知插件开始加载树节点:在此事件,加载第一层节点

  • /// 

  • /// 

  • public override List GetTreeViewData(TreeNodeArgs e)

  • {

  • if (e.Key.EqualsIgnoreCase("F_JD_TreeView") == false)

  • {

  • // 需加载是其他树控件的节点,略过

  • return new List();

  • }

  • // 加载全部节点信息到内存

  • this.LoadNodes();

  • // 记录已经加载过根节点

  • this._loadedNodeIds.Add("0");

  • // 展开树控件节点

  • TreeView tv = this.View.GetControl("F_JD_TreeView");

  • tv.SetExpanded(true);

  • // 构造根目录下的第一层节点并返回

  • List nodes = this.BuildTreeNodes("0");

  • return nodes;

  • }

  • /// 

  • /// 用户点击节点时触发此事件:加载更多子节点

  • /// 

  • /// 

  • public override void TreeNodeClick(TreeNodeArgs e)

  • {

  • if (e.Key.EqualsIgnoreCase("F_JD_TreeView") == false)

  • {

  • // 点击的是其他树控件,略过

  • return;

  • }

  • // 判断是否已经加载过此节点的子节点,如果加载过,则不再加载

  • if (this._loadedNodeIds.Contains(e.NodeId))

  • {

  • return;

  • }

  • this._loadedNodeIds.Add(e.NodeId);

  • TreeView tv = this.View.GetControl("F_JD_TreeView");

  • string parentId = e.NodeId;

  • if (parentId.StartsWith("more"))

  • {// 当前点击的节点,是"点击加载更多..."

  • string[] keys = parentId.Split('|');

  • parentId = keys[1];   // 第2部分为父节点部分

  • // "点击加载更多..."节点已经被点击过,不再需要了,移除之

  • tv.RemoveNode(e.NodeId);

  • }

  • // 开始加载更多的子节点

  • List childNodes = this.BuildTreeNodes(parentId);

  • if (childNodes.Count > 0)

  • {

  • tv.AddNodes(parentId, childNodes);

  • }

  • }

  • /// 

  • /// 构建树控件所需要的节点对象

  • /// 

  • /// 父节点Id,为0表示第一层节点

  • /// 

  • private List BuildTreeNodes(string parentId)

  • {

  • List nodes = new List();

  • // 遍历全部节点,找指定节点中,未加载的子节点的子节点

  • int count = 0;

  • int index = 0;

  • foreach (var item in _dctNodes)

  • {

  • NodeInfo nodeInfo = item.Value;

  • if (nodeInfo.Loaded == false

  • && nodeInfo.ParentId == parentId)

  • {

  • nodeInfo.Loaded = true;

  • count++;

  • TreeNode node = new TreeNode()

  • {

  • id = nodeInfo.Id,

  • text = nodeInfo.Caption,

  • parentid = nodeInfo.ParentId,

  • };

  • nodes.Add(node);

  • }

  • if (count >= 10)

  • {// 本次加载超过了10个

  • // 生成一个特殊的节点(加载更多...),并停止本批加载更多子节点

  • TreeNode node = new TreeNode()

  • {

  • // 需要基于如下需求,生成一个特殊的节点Id

  • // 1. 需要与其他普通节点进行区分:以more为前缀

  • // 2. 需要能够提取出父节点Id:包含父节点Id

  • // 3. 每次产生的特殊节点Id不能重复:需包含当前节点索引

  • id = string.Format("more|{0}|{1}", parentId, index),

  • text = "点击加载更多...",

  • parentid = parentId,

  • };

  • nodes.Add(node);

  • break;

  • }

  • index++;

  • }

  • return nodes;

  • }

  • /// 

  • /// 到数据库加载全部节点信息:本示例直接手工构建一批有层次的节点信息

  • /// 

  • private void LoadNodes()

  • {

  • // 节点名称,包含其子节点的数量,以提示用户,可以展开查看子节点

  • // 第一层节点

  • _dctNodes.Add("1", new NodeInfo() { Id = "1", ParentId = "0", Caption = "江西(100)" });

  • _dctNodes.Add("2", new NodeInfo() { Id = "2", ParentId = "0", Caption = "广东(3)" });

  • // 循环添加100个第一层节点

  • for (int i = 3; i <= 100; i++)

  • {

  • _dctNodes.Add(i.ToString(), new NodeInfo()

  • { Id = i.ToString(), ParentId = "0", Caption = string.Format("省份{0}(0)", i) });

  • }

  • // 第二层节点:

  • _dctNodes.Add("1.1", new NodeInfo() { Id = "1.1", ParentId = "1", Caption = "南昌(0)" });

  • _dctNodes.Add("1.2", new NodeInfo() { Id = "1.2", ParentId = "1", Caption = "九江(0)" });

  • _dctNodes.Add("1.3", new NodeInfo() { Id = "1.3", ParentId = "1", Caption = "赣州(0)" });

  • // 循环添加100个第二层节点

  • for (int i = 4; i <= 100; i++)

  • {

  • _dctNodes.Add(string.Format("1.{0}", i),

  • new NodeInfo()

  • {

  • Id = string.Format("1.{0}", i),

  • ParentId = "1",

  • Caption = string.Format("城市{0}(0)", i)

  • });

  • }

  • _dctNodes.Add("0201", new NodeInfo() { Id = "0201", ParentId = "02", Caption = "广州(0)" });

  • _dctNodes.Add("0202", new NodeInfo() { Id = "0202", ParentId = "02", Caption = "深圳(2)" });

  • _dctNodes.Add("0203", new NodeInfo() { Id = "0203", ParentId = "02", Caption = "惠州(0)" });

  • // 第三层节点:

  • _dctNodes.Add("020201", new NodeInfo() { Id = "020201", ParentId = "0202", Caption = "南山区" });

  • _dctNodes.Add("020202", new NodeInfo() { Id = "020202", ParentId = "0202", Caption = "宝安区" });

  • }

  • }

  • /// 

  • /// 节点信息对象

  • /// 

  • class NodeInfo

  • {

  • /// 

  • /// 本节点Id

  • /// 

  • public string Id { get; set; }

  • /// 

  • /// 父节点Id

  • /// 

  • public string ParentId { get; set; }

  • /// 

  • /// 本节点标题

  • /// 

  • public string Caption { get; set; }

  • /// 

  • /// 是否已经加载标志:默认为false,未加载到前端

  • /// 

  • public bool Loaded { get; set; }

  • }

  • }

声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com