NX二次开发-BlockUI树列表快速插入多个节点

2023-05-16

适用版本:NX 7.5及以上版本

一、概述

在NX二次开发中,我们经常使用BlockUI来设计界面,树列表控件(Tree List)是非常常用的控件之一 ,可以创建表示节点层次结构的树-节点结构,并将回调操作分配给树和节点的事件,效果像部件导航器一样。

二、功能说明

        如果显示指定目录下的子目录的名称,我们常用添加节点的方法如下:
 

//记录最后一个节点
 NXOpen.BlockStyler.Node afterNode = null;
 //遍历目录
 foreach (var directory in directoryInfo.GetDirectories())
 {
     //创建节点
     var parentNode = mToRecognizeTree.CreateNode(directory.Name);
     //设置图标
     parentNode.DisplayIcon = "folder_closed";
     parentNode.SelectedIcon = "folder_closed";
     //插入节点
     mToRecognizeTree.InsertNode(parentNode, null, afterNode, NXOpen.BlockStyler.Tree.NodeInsertOption.AlwaysLast);
     //更新最后一个节点记录
     afterNode = parentNode;
 }

      如果需要显示子目录下的孙目录的名称,这个时候我们的代码就需要修改成如下:
 

//记录最后一个节点
 NXOpen.BlockStyler.Node afterNode = null;
 //遍历目录
 foreach (var directory in directoryInfo.GetDirectories())
 {
     //创建节点
     var parentNode = mToRecognizeTree.CreateNode(directory.Name);
     //设置图标
     parentNode.DisplayIcon = "folder_closed";
     parentNode.SelectedIcon = "folder_closed";
     //插入节点
     mToRecognizeTree.InsertNode(parentNode, null, afterNode, NXOpen.BlockStyler.Tree.NodeInsertOption.AlwaysLast);
     //操作子目录
     NXOpen.BlockStyler.Node subAfterNode = null;
     foreach (var subDirectory in directory.GetDirectories())
     {
         var subNode = mToRecognizeTree.CreateNode(subDirectory.Name);
         subNode.DisplayIcon = "folder_closed";
         subNode.SelectedIcon = "folder_closed";
         mToRecognizeTree.InsertNode(subNode, parentNode, subAfterNode, NXOpen.BlockStyler.Tree.NodeInsertOption.AlwaysLast);
         subAfterNode = subNode;
     }
     //更新最后一个节点记录
     afterNode = parentNode;
 }

从上图代码可以看出以下几点不足:

1.需要定义多个记录最后一个节点;

2.父节点和最后一个节点参数容易出现手误,导致程序出现BUG;

3设置图标导致代码行增加影响阅读。

本文采用扩展方法后的效果如下:
 

foreach (var parentDir in mToRecognizeTree.InsertNodes(
     directoryInfo.GetDirectories(),//数据源
     obj => obj.Name,//选择显示文本的函数
     obj => "folder_closed"))//选择显示图标的函数
 {
     //TODO::

     foreach (var subDir in mToRecognizeTree.InsertNodes(
         parentDir.Key,//父节点
         parentDir.Value.GetDirectories(),//数据源
         obj => obj.Name, //选择显示文本的函数
         obj => "folder_closed")) //选择显示图标的函数
     {
         //TODO::

     }
 } }

上图代码的InsertNodes方法的实现如下:

using System.Collections.Generic;
using NXOpen.BlockStyler;

namespace Bizca
{
    public static class TreeControlHelper
    {
        /// <summary>
        /// 插入节点数据
        /// </summary>
        /// <typeparam name="TSource">source 中的元素的类型。</typeparam>
        /// <param name="tree">指定树列表</param>
        /// <param name="parentNode">指定父节点</param>
        /// <param name="source">数据源</param>
        /// <param name="textSelector">用于从每个元素中提取显示文本的函数。</param>
        /// <param name="action">用于从每个元素中创建节点后初始化的函数,比如设置图标、绑定数据等。</param>
        /// <returns></returns>
        public static IEnumerable<KeyValuePair<Node, TSource>> InsertNodes<TSource>(
            this Tree tree,
            Node parentNode,
            IEnumerable<TSource> source,
            System.Func<TSource, string> textSelector,
            System.Action<TSource, Node> action = null)
        {
            //验证参数
            if (source == null)
                throw new System.ArgumentNullException(nameof(source));
            if (textSelector == null)
                throw new System.ArgumentNullException(nameof(textSelector));
            //查找最后一个节点
            Node afterNode = parentNode == null ? tree.RootNode : parentNode.FirstChildNode;
            while (afterNode != null)
            {
                Node tempNode = afterNode.NextSiblingNode;
                if (tempNode == null) break;
                afterNode = tempNode;
            }
            //遍历源
            foreach (var element in source)
            {
                //创建节点
                Node newNode = tree.CreateNode(textSelector.Invoke(element));
                //初始化,比如设置图标、绑定数据等。
                action?.Invoke(element, newNode);
                //插入节点
                tree.InsertNode(newNode, parentNode, afterNode, Tree.NodeInsertOption.AlwaysLast);
                //更新最后一个节点记录
                afterNode = newNode;
                //返回集合
                yield return new KeyValuePair<Node, TSource>(newNode, element);
            }
        }

        /// <summary>
        /// 插入节点数据
        /// </summary>
        /// <typeparam name="TSource">source 中的元素的类型。</typeparam>
        /// <param name="tree">指定树列表</param>
        /// <param name="parentNode">指定父节点</param>
        /// <param name="source">数据源</param>
        /// <param name="textSelector">用于从每个元素中提取显示文本的函数。</param>
        /// <param name="iconSelector">用于从每个元素中提取显示图标的函数。</param>
        /// <returns></returns>
        public static IEnumerable<KeyValuePair<Node, TSource>> InsertNodes<TSource>(
            this Tree tree,
            Node parentNode,
            IEnumerable<TSource> source,
            System.Func<TSource, string> textSelector,
            System.Func<TSource, string> iconSelector)
        {
            System.Action<TSource, Node> action = (eSource, newNode) =>
            {
                if (iconSelector != null)
                {
                    string icon = iconSelector.Invoke(eSource);
                    newNode.DisplayIcon = icon;
                    newNode.SelectedIcon = icon;
                }
            };
            return InsertNodes(tree, parentNode, source, textSelector, action);
        }
    }
}

三、总结

      将TreeControlHelper类封装成基础库重复调用,这种方式可以避免以上出现的不足,快速的插入多个或多级节点到树列表空间中,不容易出现BUG,便于阅读和调试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NX二次开发-BlockUI树列表快速插入多个节点 的相关文章

  • SOLIDWORKS 二次开发 VC++

    需要理解的知识 com组件原理及应用 1 IUnknown IDiapatch 2 接口的指针指向接口这个结构 xff0c 接口里面保存一个虚函数表指针 xff0c 指向接口里的函数 3 接口的使用 43 通过queryInterface
  • 基于Python语言的Abaqus二次开发-求最大Mises应力

    利用python访问Odb文件 xff0c 求Mises应力的最大值 下面说明了如何从系统提示符运行示例脚本 该脚本将在输出数据库中搜索元素集 ALL ELEMENTS xff0c 以查找冯米塞斯应力的最大值 xff1a from odbA
  • 酷Q 二次开发 C++SDK 加python混合编程

    酷Q 源代码 xff1a https github com richardchien coolq cpp sdk 不用问我这个怎么用啊 xff0c 去酷Q社区去看看 xff0c 会C 43 43 开发的应该很简单 xff0c 实在不会留言我
  • NX二次开发-BlockUI树列表快速插入多个节点

    适用版本 xff1a NX 7 5及以上版本 一 概述 在NX二次开发中 xff0c 我们经常使用BlockUI来设计界面 xff0c 树列表控件 xff08 Tree List xff09 是非常常用的控件之一 xff0c 可以创建表示节
  • MAVROS二次开发(四)添加消息处理插件

    转载自 xff1a https blog csdn net qq 38981124 article details 104861900 MAVROS二次开发 xff08 四 xff09 添加消息处理插件 小柏QAQ 2020 03 14 1
  • jupyter-notebook二次开发

    背景 公司内部提供给算法人员用于模型训练的平台开发需求中提出了嵌入Jupyter Notebook模块 xff0c 而Jupyter Notebook是开源的 xff0c 方便后续对部分细节进行功能定制和优化 xff0c 需要对其进行调研
  • 【PX4 二次开发 初级】 02 飞控软硬件体系

    PX4 二次开发初级 PX4 飞控软硬件体系 飞控硬件体系PIXHAWK 控制硬件 软件体系PX4 体系原生固件原生固件官网原生固件地面站 APM 体系APM官网 xff1a 原生固件地面站 特点 标题 xff1a PX4二次开发教程 xf
  • PX4:二次开发:流程

    1 程序编写 xff08 用模板简单实现一个程序 xff09 gt 进阶 xff1a 不同项目下的程序规范 xff1b 调用子模块的流程 2 在Nuttx系统中注册应用并编译 为了使该程序能够编译进固件 xff0c 需要在系统的cmake文
  • kvaser二次开发

    总结归纳 xff1a 实施步骤 xff1a 通过浏览网上的大量关于can总线开发的资料 xff0c 建立起对can总线软件开发的大致流程记录优质资料将开发过程流程化通过官方资料研究技术细节开工 技术要点 xff1a can协议 xff0c
  • MAVROS二次开发(一)MAVROS的安装

    MAVROS二次开发 一 MAVROS的安装 1 参考网址 https dev px4 io v1 10 en ros mavros installation html https github com mavlink mavros tre
  • MAVROS二次开发(四)添加消息处理插件

    MAVROS二次开发 四 添加消息处理插件 mavros插件所在路径 xff1a catkin ws src mavros mavros src plugins 1 自定义消息处理插件的编写 参考代码 xff1a catkin ws src
  • MAVROS二次开发(五)进行测试

    MAVROS二次开发 五 进行测试 1 测试环境 PX4 xff1a v1 10 1 xff08 含自定义mavlink消息收发 xff09 ROS xff1a KineticUbuntu xff1a 16 04LTSQGC xff1a S
  • 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)

    最近在做一个项目 xff0c 涉及到工业相机 xff0c 需要对其进行二次开发 相机方面选择了海康威视 xff0c 网上关于海康威视工业相机SDK的开发资料很少 xff0c 官方文档里面虽然写的是支持C 43 43 开发的 xff0c 但其
  • vue-element-admin的二次开发

    最近也是完成了公司招聘管理系统后台的前端开发 xff0c 项目已经开始测试了近期估计就会交付使用 一直是一个人在做 xff0c 配合两个后端 xff0c 说实话这种从很多不会到一个个独立debug解决问题到最后终于完成项目的感觉真的太有成就
  • RealSense二次开发

    转载 xff1a librealsense2查看相机设备信息 JavaShuo 文章目录 1 librealsense2设备信息读取 xff12 xff0e realsense 投影函数和反投影函数3 深度相机与彩色相机的坐标变换 1 li
  • vue-element-admin 二次开发 报错修改

    安装 GitHub git clone https github com PanJiaChen vue element admin git Gitee https gitee com panjiachen vue element admin
  • DIY个人智能家庭网关—— 路由器篇之安装python

    Python是一种解释型 面向对象 动态数据类型的高级程序设计语言 在openwrt上进行二次开发编写自己的程序 python肯定是最方便最快捷的编程语言 因为它是解释型语言 无需openwrt的编译环境 只要安装好了python就可以直接
  • jQuery ajax 中有进度更新事件吗?

    我有一个长时间运行的任务 使用 jquery ajax 调用 我正在使用阻止 ui 插件显示 加载中 无论如何 我可以将进度消息发送回客户端以显示进度 并在块 ui 插件消息上更新该进度 所以它会显示这一点 当服务器完成其工作时 正在加载第
  • blockui 优于 jQueryUI 模式对话框

    我无法让 BlockUI 在模式对话框上工作 我尝试解决 z index 问题 但没有成功 在我的网页中 这是标题
  • 如何定位整个 JSF 页面被 p:blockUI / pe:blockUI 阻止?

    该示例演示了阻塞

随机推荐

  • golang备份和恢复

    我们经常会遇到生产服务器的网络断了 硬盘坏了 操作系统崩溃 或者数据库不可用了等各种异常情况 xff0c 所以维护人员需要对生产服务器上的应用和数据做好异地灾备 xff0c 冷备热备的准备 在接下来的介绍中 xff0c 讲解了如何备份应用
  • golang自定义路由器设计

    HTTP路由组件负责将HTTP请求交到对应的函数处理 或者是一个struct的方法 xff0c 如前面小节所描述的结构图 xff0c 路由在框架中相当于一个事件处理器 xff0c 而这个事件包括 xff1a 用户请求的路径 path 例如
  • golang中的Session支持

    session集成 beego中主要有以下的全局变量来控制session处理 xff1a related to session SessionOn bool 是否开启session模块 xff0c 默认不开启 SessionProvider
  • golang表单及验证支持

    在Web开发中对于这样的一个流程可能很眼熟 xff1a 打开一个网页显示出表单 用户填写并提交了表单 如果用户提交了一些无效的信息 xff0c 或者可能漏掉了一个必填项 xff0c 表单将会连同用户的数据和错误问题的描述信息返回 用户再次填
  • sublime搭建C/C++编译环境

    代码一 xff1a 34 cmd 34 34 g 43 43 34 34 file 34 34 std 61 c 43 43 11 34 34 o 34 34 file path file base name 34 34 amp 34 34
  • golang用户认证

    在开发Web应用过程中 xff0c 用户认证是开发者经常遇到的问题 xff0c 用户登录 注册 登出等操作 xff0c 而一般认证也分为三个方面的认证 HTTP Basic和 HTTP Digest认证第三方集成认证 xff1a QQ 微博
  • golang多语言支持

    专注后台开发相关技术 xff0c 广度深度并存 xff0c 干货情怀同在 微信搜索 盼盼编程 关注这个不一样的程序员 强烈推荐人工智能学习网站 beego中设置全局变量如下 xff1a Translation i18n IL Lang st
  • golang中的pprof支持

    专注后台开发相关技术 xff0c 广度深度并存 xff0c 干货情怀同在 微信搜索 盼盼编程 关注这个不一样的程序员 强烈推荐人工智能学习网站 Go语言有一个非常棒的设计就是标准库里面带有代码的性能监控工具 xff0c 在两个地方有包 xf
  • 大厂动态规划面试汇总,提升内功

    注 xff1a 本文是BAT真题收录很值得大家花心思看完 xff0c 看完会有收获 前言 算法是面试大公司必考的项目 xff0c 所以面试前准备好算法至关重要 xff0c 今天整理的常见的动态规划题目 xff0c 希望可以帮到大家 要想学习
  • 进程知识点,只需这一篇

    前言 你的进程 xff0c 为啥挂了 xff1f 进程挂了 xff0c 这个问题大家并不陌生 学完这篇 xff0c 你会对进程有一定了解 后面碰到进程挂的情况 xff0c 你很快能找到对应解决思路 进程在操作系统中 xff0c 是一个很重要
  • 算法:多数元素,多种解法

    前言 xff1a 以前做数学题的时候 xff0c 老师说 xff1a 你们学习多种解题方法 遇到类似不同的问题 xff0c 你都会了 xff0c 这样能提高解题能力 如果你写出多种解法 xff0c 面试官会对你刮目相看 下面一题 xff0c
  • 栈和队列互相实现,一文弄懂它们的关系

    前言 栈和队列是比较基础的数据结构 无论在工作中 xff0c 还是在面试中 xff0c 栈和队列都用的比较多 在计算机的世界 xff0c 你会看到队列和栈 xff0c 无处不在 栈 xff1a 一个先进后出的数据结构 队列 xff1a 一个
  • linux下调试core dump方式汇总,工作必备技能

    缘起 调试 xff0c 是开发流程中一个非常重要的环节 每个程序员都应 xff0c 具备调试代码的能力 xff0c 尤其对于从事 Linux 下的开发的读者 从事 linux 下后台开发 xff0c 有时候会遇到程序突然崩溃的情况 xff0
  • TCP 连接的前世今生

    前言 大家好 xff01 我是盼盼 xff01 之前写了几篇关于算法和 linux 命令的文章 xff0c 今天来学习下 xff0c 网络协议相关的知识 不管你是客户端 xff0c 还是服务端开发 xff0c 网络协议这块都是要学习和了解的
  • 反向传播算法推导过程(看一篇就够了)

    反向传播BackPropagation算法简称BP xff0c 算是神经网络的基础了 在神经网络中 xff0c 正向传播用于模型的训练 xff0c 模型中的参数不一定达到最佳效果 xff0c 需要进行 反向传播 进行权重等参数的修正 此外
  • 2021-08-21

    Snapper for Mac是一款强大的音频文件编辑软件 Snapper mac版会跟随您在Finder中选择的文件 选择音频文件后 xff0c 它会立即显示波形 并支持50 多种声音文件格式 还等什么 xff0c 快来下载吧 xff01
  • MAC系统如何连接Windows共享文件?MAC系统连接Win共享文件的方法

    MAC系统如何连接Windows共享文件 xff1f MAC系统和Windows是两个不同的系统 xff0c 有时候我们想要MAC系统访问Windows共享文件 xff0c 那么有什么方法呢 xff0c 下面小编就为大家介绍一下 MAC系统
  • mac恢复文件的方法,在Mac上使用时间机器恢复文件

    如果您使用时间机器对 Mac 上的文件进行备份 xff0c 则可以轻松恢复丢失的项目 xff0c 或者恢复文件的较早版本 您可以在很多 App 中使用时间机器 1 在 Mac 上 xff0c 打开想要恢复项目的窗口 例如 xff0c 若要恢
  • 中断响应流水灯控制程序

    include lt reg51 h gt void delay unsigned int i int main void using 0 int i 61 1 EA 61 1 EX0 61 1 IT0 61 1 P0 61 0 while
  • NX二次开发-BlockUI树列表快速插入多个节点

    适用版本 xff1a NX 7 5及以上版本 一 概述 在NX二次开发中 xff0c 我们经常使用BlockUI来设计界面 xff0c 树列表控件 xff08 Tree List xff09 是非常常用的控件之一 xff0c 可以创建表示节