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树列表快速插入多个节点 的相关文章

  • CATIA二次开发CAA安装

    安装资料在网盘里 Win7 64位 以下软件均已管理员身份运行 xff1a 1 安装vs2008 gt 自定义安装 gt 选择要安装的功能 gt Visual C 43 gt x64编译器和工具 1 2安装SP1 2 安装CATIA V5
  • SOLIDWORKS 二次开发 VC++

    需要理解的知识 com组件原理及应用 1 IUnknown IDiapatch 2 接口的指针指向接口这个结构 xff0c 接口里面保存一个虚函数表指针 xff0c 指向接口里的函数 3 接口的使用 43 通过queryInterface
  • 酷Q 二次开发 C++SDK 加python混合编程

    酷Q 源代码 xff1a https github com richardchien coolq cpp sdk 不用问我这个怎么用啊 xff0c 去酷Q社区去看看 xff0c 会C 43 43 开发的应该很简单 xff0c 实在不会留言我
  • MAVROS二次开发(四)添加消息处理插件

    转载自 xff1a https blog csdn net qq 38981124 article details 104861900 MAVROS二次开发 xff08 四 xff09 添加消息处理插件 小柏QAQ 2020 03 14 1
  • Ubuntu18.04-Melodic-Mavros源码安装,Mavros二次开发。

    如果是会对Mavros进行修改二次开发 xff0c 那么建议使用源码安装 网上没有找到Melodic的安装教程 xff0c 所以自己摸索了一下 xff0c 希望能帮到大家 参考网址 xff1a mavros mavros at master
  • 海康威视网络摄像头SDK二次开发(QT版本)

    暂时使用到的主要功能有四个 xff1a 1 连接相机 xff0c 2 实时显示 xff0c 3 取图 xff08 bmp格式 xff09 xff0c 4 关闭相机 在官网下载对应的win64的SDK xff0c 在库文件中运行demo ex
  • 【PX4 二次开发 初级】 02 飞控软硬件体系

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

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

    PX4二次开发 uorb订阅 一 写在前面 我们写了一个一个功能的模块 xff0c 这些模块并不是独立的 模块之间是有数据传递的 xff0c 这样才能组合到一起实现飞行控制的目的 那么解决模块之间的数据传递的方式就是通过uorb订阅的方式
  • 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)

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

    本文接上次的博客海康威视工业相机SDK二次开发 xff08 VS 43 Opencv 43 QT 43 海康SDK 43 C 43 43 xff09 xff08 一 xff09 xff0c 上个博客中并未用到QT xff0c 本文介绍项目内
  • QGC4.1.2二次开发(2)QGC连接与数据收发

    文章目录 前言一 连接原理二 连接过程与数据收发1 连接过程 xff08 以串口为例 xff09 2 数据发送 总结 前言 QGC连接无人机飞控时支持多种连接方式 xff0c 并且可以自动连接 xff0c 不由让人好奇它的实现原理 xff0
  • 关于OpenAI的Gym中的step方法

    文章目录 导读 Gym的step方法 最后的话 导读 本文就只是关于step方法的参数与返回值的一个小小的学习笔记 这也是没有第一时间查官方文档而造成的时间消耗 所以 这篇博客就是逼自己查一下 Gym的step方法 既然都已经用pip下载了
  • .NET 最便捷的Log4Net日志记录器

    最便捷的Log4Net使用方法 LOG4NET 配置日志记录器 开始 引用nuget LOG4NET 配置日志记录器 Apache log4net 库是一个帮助程序员将日志语句输出到各种的工具 的输出目标 log4net是优秀的Apache
  • jQuery ajax 中有进度更新事件吗?

    我有一个长时间运行的任务 使用 jquery ajax 调用 我正在使用阻止 ui 插件显示 加载中 无论如何 我可以将进度消息发送回客户端以显示进度 并在块 ui 插件消息上更新该进度 所以它会显示这一点 当服务器完成其工作时 正在加载第
  • jquery blockUI 判断页面或特定元素是否被阻止

    有没有办法判断 blockUI 是否有效已被调用但 unblockUI 尚未被调用 理想情况下 这应该能够阻止整个页面和特定元素 我希望它能像这样工作 gt blockUI gt isBlockUI gt gt true gt unbloc
  • 用jquery拦截ajax请求显示BlockUI

    我正在尝试使用 jquery 拦截 ajax 请求 以显示等待消息 就像使用插件 BlockUI 一样 但是如何拦截由 asp net 框架提供的 UpdatePanel 发送的请求 有什么方法可以触发 Thanks 您可以使用开始请求 a
  • 阻止 UI 旋转预加载器

    我想知道是否有人可以深入了解如何使用 jQuery Block UI 插件添加旋转预加载器 如苹果使用 预加载器必须旋转 直到 AJAX 内容加载 Block UI 可以做到这一点吗 任何方向都会有帮助 谢谢 Find a good ani
  • 阻止特定 DIV 的 UI Jquery 插件

    任何人都知道 BlockUI 的 JQuery 插件 它允许阻止特定的 DIV 而不仅仅是整个页面 谢谢 你可以通过blockui http jquery malsup com block element plugin
  • 如何定位整个 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 可以创建表示节