NFace TreeViewer 和ListViewer(JFace Viewer在.Net中的简单实现)

人脸检测widerface数据集 人脸检测widerface数据集预处理,生成适用于mobilenet-ssd物体检测模型训练的xml及.record文件格式一、生成voc格式的数据集二、修改widerface数据集xml文件中人脸位置信息三、将widerface数据集分割成训练集及测试集四、通过xml文件生成csv文件五、生成.record文件 全部数据集及代码链接:点击 一、生成voc格式的数据集 1.从官方网站下载 wide... 阅读详情

  NFace的简单实现

如果您熟悉JFace,那么你最大的感触是什么?优良的设计框架?精简易用的API?简单方便的数据绑定?
以前做基于Eclipse RCP开发的时候,我被JFace的易用和思想吸引,感觉很优雅。JFace中的UI组件十分丰富,功能很多,今天想谈谈如何在.NET中实现其中的一两个组件,也算是我技术BLOG开篇之作。对于.NET中TreeView的DataBinding,我很不喜欢,于是想到模仿JFace TreeViewer的接口写一个.NET版本的NFace TreeViewer,另外将JFace TableViewer实现为NFace ListViewer。但这里只说说TreeViewer的实现,ListViewer的思想是相同的。


一、首先看一下这两个组件的类图,懒得用建模画UML了,下图用VS2005自带的ClassDiagram工具生成:
1.首先是CTreeViewer的类图


1.1       CTreeNode继承于TreeNode类
 

成员
说明
Data
用于存放业务数据(通常是实体类的实例),这样,可以方便的在用户点击树上节点时,取得相应业务数据。
HasGotChildren
是否已经取得过子节点。
IsBlankNode
是否时空节点,空节点是看不到的节点,仅仅用于生成节点上的展开加号,这样,当某个节点未展开时,其下有一个空节点,那么就会形成加号。
NeedRefresh
节点是否需要刷新。
CTreeNode(bool isBlankNode)
用是否空节点构造一个节点
CTreeNode(object obj)
用业务数据构造一个节点
CTreeNode(string text, object obj)
用节点显示文字和业务数据构造一个节点
 
1.2          ITreeViewLabelProvider,CTreeViewer的显示提供器
 

成员
说明
GetImageIndex(object obj)
获取树节点文字前的图像索引号
GetLabel(object obj)
获取树节点显示的字符串
GetSelectedImageIndex(object obj)
获取树节点被选中时文字前的图像索引号
 
1.3          ITreeViewContentProvider,CTreeViewer的内容提供器
 

成员
说明
GetElements()
获根节点对象(可以有多个根节点)
GetElements(object obj)
获取obj节点下的子节点
HasChildren(object obj)
判断obj节点下是否有子节点
 
1.4          CTreeViewer类,继承于TreeView
 

成员
说明
ContentProvider
CTreeViewer的内容提供器
LabelProvider
CTreeViewer的显示提供器
GetChildrenWhenExpand
是否在展开树节点是获取其子节点,该属性影响性能,设置为True时,节点展开时只获取当前层的数据;设置为False时,每次展开一个节点不光获取当前层的数据,也同时获取当前层所有节点的子节点的数据(也就是每次展开一个节点获取两层节点数据)
ExpandToLevel(int)
展开树到指定层
ExpandToLevelByThread(int)
展开树到指定层(线程中完成)
RefreshOnlyOneNode(CTreeNode)
刷新某个节点
OnAfterExpand(TreeViewEventArgs)
重载TreeView的展开后方法,完成获取子节点,构造树的工作
ShowTree()
根据给定的内容提供器和显示提供器,构造显示树内容
 
 
2.然后是NFace ListViewer的类图:


对于CListViewer的类图不再作详细解释,类似CTreeViewer。
 
二、思想
实现IContentProvider和ILabelProvider后,CTreeViewer根据实现该接口的类实例来自动构造一颗树,ContentProvider提供树节点数据(后台业务数据)以及数据之间的关系(父子节点关系),LabelProvider定义如何显示树节点(节点的图标、文字内容)。
 
三、用法
这里举一个简单的例子,将地区信息显示成一颗树。该例中数据从XML读取:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  
<District>
    
<ID>0</ID>
    
<Name>中国</Name>
    
<ParentID>-1</ParentID>
    
<IsLeave>false</IsLeave>
  
</District>
  
<District>
    
<ID>1</ID>
    
<Name>美国</Name>
    
<ParentID>-1</ParentID>
    
<IsLeave>false</IsLeave>
  
</District>
  
<District>
    
<ID>2</ID>
    
<Name>日本</Name>
    
<ParentID>-1</ParentID>
    
<IsLeave>true</IsLeave>
  
</District>
  
<District>
    
<ID>3</ID>
    
<Name>韩国</Name>
    
<ParentID>-1</ParentID>
    
<IsLeave>true</IsLeave>
  
</District>
  
<District>
    
<ID>4</ID>
    
<Name>北京</Name>
    
<ParentID>0</ParentID>
    
<IsLeave>true</IsLeave>
  
</District>
  
<District>
    
<ID>5</ID>
    
<Name>上海</Name>
    
<ParentID>0</ParentID>
    
<IsLeave>false</IsLeave>
  
</District>
  
<District>
    
<ID>6</ID>
    
<Name>杭州</Name>
    
<ParentID>0</ParentID>
    
<IsLeave>true</IsLeave>
  
</District>
  
<District>
    
<ID>7</ID>
    
<Name>浦东新区</Name>
    
<ParentID>5</ParentID>
    
<IsLeave>false</IsLeave>
  
</District>
  
<District>
    
<ID>8</ID>
    
<Name>徐汇区</Name>
    
<ParentID>5</ParentID>
    
<IsLeave>true</IsLeave>
  
</District>
  
<District>
    
<ID>9</ID>
    
<Name>杨浦区</Name>
    
<ParentID>5</ParentID>
    
<IsLeave>true</IsLeave>
  
</District>
  
<District>
    
<ID>10</ID>
    
<Name>合庆镇</Name>
    
<ParentID>7</ParentID>
    
<IsLeave>true</IsLeave>
  
</District>
  
<District>
    
<ID>11</ID>
    
<Name>张江镇</Name>
    
<ParentID>7</ParentID>
    
<IsLeave>true</IsLeave>
  
</District>
  
<District>
    
<ID>12</ID>
    
<Name>川沙镇</Name>
    
<ParentID>7</ParentID>
    
<IsLeave>true</IsLeave>
  
</District>
  
<District>
    
<ID>13</ID>
    
<Name>加州</Name>
    
<ParentID>1</ParentID>
    
<IsLeave>true</IsLeave>
  
</District>
</NewDataSet>

简单说明一下:ID是某个地区的ID号,Name是地区名字,ParentID是上级地区的ID号,IsLeave表示是否是叶子地区(其下没有子地区)。

3.1 新建一个WinForm程序,引入IZero.NFace.dll,在窗口上拖放一个CTreeViewer组件,取名为ctv。

3.2 实现一个ContentProvider
class ContentProvider : IZero.NFace.CTreeView.ITreeViewContentProvider 
        
{
            
private DataSet ds;

            
public ContentProvider(DataSet ds)
            
{
                
this.ds =( ds == null ? new DataSet() : ds);  //这里数据集从构造函数传入
            }


            
ITreeViewContentProvider 成员
        }

3.3 实现一个LabelProvider
   class LabelProvider : IZero.NFace.CTreeView.ITreeViewLabelProvider
        
{
            
ITreeViewLabelProvider 成员
        }


3.4 在FormLoad事件里,加载XML文件到一个DataSet,以便待会儿传入ContentProvider,并且对CTreeViewer的内容提供器和显示提供器设置提供器。
 private void FrmTest_Load(object sender, EventArgs e)
        
{          
            DataSet ds 
= new DataSet();
            
try
            
{
                ds.ReadXml(
"TestData.xml");
                
                
this.ctv.ContentProvider = new ContentProvider(ds);
                
this.ctv.LabelProvider = new LabelProvider();
                
this.ctv.GetChildrenWhenExpand = true;  //Default is true
            }

            
catch (Exception err)
            
{
                MessageBox.Show(err.Message);
            }

        }


3.5 在窗口上放一个显示按钮,在其单击事件中,调用CTreeViewer的ShowTree()方法即可。


四、效果图



今天先写到这里,关于CListViewer和CTreeViewer的使用,将会在后续篇幅中用到(可能是一个简单的数据库浏览器)。由于第一次写技术BLOG,经验不足,敬请谅解。


NFace源码和示例程序 下载地址: 目前似乎还不能上传除图片外的资源,不清楚是否支持。如果您想要源码和示例程序,请留下email,我会通过邮件发送。


【007】C++编程必知:原码、补码、反码的全面解读 计算机存储的是数据的补码。原码:计算机中对数字的二进制定点表示方法。比如123的原码是0111 1011。无符号数:原码=反码=补码。有符号数:要分正数和负数,正数的最高位为0,负数的最高位为1。其中,正数的原码、反码、补码都是相同的;负数的反码等于原码的符号数(最高位)不变,其他位取反;补码等于反码+1。比如:-123的原码是1111 1011,反码为1000 0100,补码为1000 0101。原码、补码和反码都是用于计算机表示有符号整数的方法。 阅读详情

相关推荐

MST-GAT: Enhancing Anomaly Detection in Multimodal Time Series with Intra- and Inter-Modal Attention

本文深入解析了MST-GAT模型,这是一种通过模态内与模态间注意力机制增强多模态时间序列异常检测的新方法。它通过构建图结构显式建模传感器间的复杂时空依赖,并结合时间卷积网络与联合优化策略,有效降低了传统方法中常见的误报与漏报问题,在工业监控等场景中展现出卓越性能。

weixin_29079671的博客 150

【Vb.net】TreeView 控件详解 (VB.NET, VS2010)

' 定义部门类End SubEnd Class' 定义员工类End SubEnd Class' 绑定自定义对象到TreeView' 创建测试数据Dim dept1 As New Department(1, "人事部")dept1.Employees.Add(New Employee(1, "张三"))dept1.Employees.Add(New Employee(2, "李四"))Dim dept2 As New Department(2, "财务部")

weixin_43910833的博客 595

告别迷茫!新手如何从RTKLIB命令行程序入手,快速理解GNSS解算全流程

本文为GNSS新手提供RTKLIB命令行程序实战指南,重点介绍如何通过`rnx2rtkp`后处理解算工具快速掌握GNSS解算全流程。从环境搭建、程序编译到核心算法解析,帮助读者理解RTKLIB源码结构,并通过真实数据处理案例演示完整解算过程,是入门GNSS定位技术的实用教程。

weixin_42524226的博客 359

asp.net2.0利用TreeView实现无限级树型菜单

闲话不说,下面开始:第一步:创建一个asp.net工程,命名为TreeViewTest(自己喜欢吧,叫什么都可以)。第二步:在工程中添加一个XML文件,命名为TreeSource.xml;将Default.aspx切换到设计视图,拽进一个TreeView控件命名为TreeView1和一个XmlDataSource控件命名为XmlDataSource1,配置TreeView1的数据源为Xml

xhlinlinxh的专栏 1877

W5500 MACRAW模式实战:在ESP32上抓取并解析原始以太网数据包

本文详细介绍了如何在ESP32开发板上使用W5500芯片的MACRAW模式捕获和解析原始以太网数据包。通过硬件连接指南、代码实现示例和协议解析技巧,帮助开发者深入理解网络通信底层机制,实现网络嗅探和自定义协议开发等高级应用。

weixin_42520573的博客 418

信息收集-服务器信息

服务器上面可以运行大量的系统服务和第三方应用服务,如果操作系统或者第三方软件没有及时升级打补丁,攻击者就有可能直接通过服务器上运行的服务进行攻击。

weixin_49349476的博客 1446

.net中TreeView使用方法小结(1)

在新项目的开发中,TreeView的作用很重要,这两天好好的学习了一下treeview的使用方法。 这篇文章主要关注TreeView带有CheckBox的情况。 在TreeView中点击CheckBox触发的函数如下: private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) ...

weixin_30537451的博客 166

SAP UI5 OData V4 操作结果访问:从 getObject 到返回值上下文与 $$inheritExpandSelect

SAP UI5 OData V4 操作结果获取指南 摘要:在 SAP UI5 OData V4 模型中,操作结果需通过绑定上下文获取而非直接从 invoke() 返回。本文详解核心要点: 数据获取路径 使用 invoke() 发起请求后,通过 getBoundContext().getObject() 获取结果 特定场景下 invoke() 可能返回返回值上下文(如草稿切换) 关键实践技巧 使用 $$inheritExpandSelect 继承字段选择,避免二次读取 对象页应用中,通过替换绑定上下文实现无缝

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 314

JFace Viewer API CheckboxTreeViewer

TreeViewerTreeViewer 类封装了tree控件。树查看器按照父子关系来显示分等级的对象列表。此查看器需要设置标签供给器和内容供给器。The CheckboxTreeViewer加入了对个别条目泛灰的支持,还可以选中和反选与条目相关联的复选框。常用的API包括: add(Object, Object) 为查看器中指定元素添加子元素。 add(Object, Object[]) 为

Steve_wang_victor的专栏 2680

【数据集】未来不同情景下预测数据:如人口、土地利用等

未来不同情景下预测数据:如人口、土地利用等

WW、forever的博客 2995

【系列05】端侧AI:构建与部署高效的本地化AI模型 第4章:模型量化(Quantization)

量化的基本思想是减少模型中用于表示参数和激活值的比特数。在模型训练时,参数通常使用32位浮点数(FP32)进行存储,这提供了高精度,但也消耗大量的内存和计算资源。量化则将这些32位浮点数转换成低比特数表示,通常是8位整数(INT8)。量化的原理可以概括为:对浮点数范围进行校准,并将其映射到更小的整数范围内。例如,将一个FP32的权重(如-1.5到1.5)映射到INT8的范围(-128到127)。在推理过程中,模型将使用这些低精度的整数进行计算,从而大大减少了所需的计算量。量化带来的主要收益减少模型大小。

学习,输出==》再学习再输出 1215

人脸识别常用数据集大全(12/20更新)

人脸识别常用数据集大全(12/20更新) 原文首发地址:人脸识别常用数据集大全(12/20更新) - 极市博客 1.PubFig: Public Figures Face Database(哥伦比亚大学公众人物脸部数据库) The PubFig database is a large, real-world face dataset con...

weixin_33974433的博客 9154

rk3568 Android12 增加 USB HOST 模式开关(二)

将原有 USB-C 改为 USB-A,并在设置中增加USB工作模式开关可以让用户选择USB端口的功能模式,例如充电、文件传输、或MIDI设备。用户能够灵活管理设备的连接方式,优化数据传输和设备兼容性。

weixin_35723192的博客 734

jface获得treeview中某一行某一列 变色

此处用的是CheckboxTreeViewer  和treeview大同小异   首先获得Point tree.addMouseListener(new MouseListener() {        @Override    public void mouseUp(MouseEvent e) {         }        @Override    public v

zhuzhenlong998的专栏 2880

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

微软技术日报 11-09:.NET 8 与 9 明日同时停止支持,注册表编辑器出了 WinUI 3 版

今天这四条消息的共同点是收口。.NET 8 和 9 的支持期到点,注册表编辑器的新界面只放在仓库里给人看,GitHub 把一类危险触发器按住默认,微软在安全报告里把防线从地址黑名单挪到行为。收口并不等于关门。.NET 10 还在支持期里,被按住的触发器可以用策略按文件放回来,实验室里的样例随时可能变成产品。区别在于这些动作要有人签字,不再是默认开着。如果今天只做一件事,去看一眼构建机上的 .NET 版本。明天之后,8 和 9 的漏洞补丁不会再来了。

海盗Sharp的博客 322

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

11-01-演进-.NET GC发展史

.NET GC发展史映射硬件演进:从单核STW到多核并发,再到区域化细粒度回收。历经分代管理、ServerGC、BackgroundGC、LOH自动压缩、POH隔离、DATC自适应线程数及Region-based管理等关键革新,代码量从5000行增至4万+,复杂度指数上升。每一步优化均在暂停时间、吞吐量与资源开销间权衡,体现“实用主义”哲学。核心启示:GC演进由硬件驱动,方向明确——更短暂停、更高效率,但代价是工程复杂性持续攀升。

设计 AI 玩游戏🎮 373

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

微软技术周报 11-02~11-09:VS Code 混装 Claude 与 Codex、EF Core 11 静默改行为、.NET 11 倒计时

11 月 6 日,Power Platform 通过消息中心通知管理员,Copilot Studio、Power Automate 和 Power Apps 里所有跑在 Anthropic Claude、xAI Grok 以及旧版 GPT 上的 prompt,12 月 2 日自动迁移到 GPT-6 系列,档位价格不变,模型选择收窄到一条产品线。效果是这样的:让 Claude 评审一个 Copilot chat 写出的方案,或者把同样的任务交给 Codex,两边并排跑在同一个会话里。更要紧的是下周的时间线。

海盗Sharp的博客 832

.NET 10 的性能提升

你不需要重写代码去用Span<T>,不需要手工池化对象,甚至不需要调整 GC 配置。JIT 编译器变得更“聪明”了,它会在编译时替你完成一些过去需要手动干预的优化。但与此同时,.NET 10 也引入了一个默认开启的 GC 行为变化,它在某些场景下会。这篇文章想讲清楚:哪些性能是你“自动”拿到的,哪些是需要你主动审视和取舍的。

qq_41019429的博客 349

在 .NET 10 中使用 Keycloak.Admin.Sdk 管理 Keycloak:从基础接入到功能开关

面向 .NET 10 / Native AOT 的 Keycloak Admin REST API 客户端,当前仅支持 Keycloak 26.8.1。主包引用 Microsoft.Extensions.Http 10.0.14 和 Microsoft.Extensions.Http.Resilience 10.11.0,使用源生成 JSON 元数据,默认关闭反射序列化。仓库固定 .NET SDK 10.0.403。

ChaITSimpleLove的博客 369

.NET 性能优化:先找瓶颈,再谈技巧

NET 性能优化没有“一招鲜”。Span<T>ValueTaskstackalloc这些工具在特定场景下确实很强,但它们解决的是微观层面的分配问题。如果你的应用瓶颈在数据库查询或者线程池阻塞,用再多Span<T>也救不回来。先测量,找到热路径,再针对性修改,改完再测量验证。跳过第一步的优化,大概率是在给编译器添乱。

qq_41019429的博客 379

.NET 11 - 尝试一下Blazor中的新特性SupplyParameterFromTempData

时光匆匆,.NET Conf 2026大会将会在2026年11月份举办(11/10-11/13),到时微软将会发布.NET11,这是一个STS版本(Standard Term Support), 微软提供两年支持。当前.NET 11已经处于RC3版本(Release Candidate 3),很多新特性已经被发布出来了。

limingdinghao的博客 233

在.NET WinForms中创建SQLite数据库

本文介绍在WinForms项目中使用SQLite的完整流程:通过NuGet安装System.Data.SQLite.Core包,将数据库文件置于程序目录下,利用CREATE TABLE IF NOT EXISTS实现自动建库建表;通过封装GetConnection()方法管理连接,初始化时调用Init()创建表结构;后续通过参数化SQL实现增删改查操作,支持数据绑定、登录验证等场景,确保安全高效。

2301_80809484的博客 296

基于.NET的Windows窗体编程之WinForms数据持久化(1)

本文介绍了在.NET Windows窗体开发中,基于EFCore与SqlSugar两种主流ORM框架实现数据持久化的实践。通过创建实体模型、配置DbContext或ConnectionConfig,结合增删改查操作,展示了如何高效完成数据库交互。EFCore适合复杂CRUD场景,支持LINQ与迁移;SqlSugar则以简洁API和高性能著称,适用于快速开发。两者均显著降低SQL编写量,提升代码可维护性,助力开发者专注业务逻辑。

绳锯木断,水滴石穿,专心写文,无问西东!!! 169

FFmpeg × C# 实战:从命令行原理到 .NET 工程化落地

本文系统讲解 FFmpeg 的核心概念(容器/编码/流/滤镜/时间基),并给出 C# 对接的五条技术路线对比。重点实现一个可落地的 FFmpegRunner 封装,解决管道死锁、结构化进度解析、取消超时、二进制分发与参数注入五大工程问题;随后覆盖转码、裁剪、合并、抽帧、限体积压缩、水印、硬件加速六大高频场景,并附安全清单与排错速查表。

李赛赛的专栏 617

一款基于 .NET 开源、免费的数据库自治诊断平台

DBPilot。它解决的是 DBA 日常工作中最耗时的痛点:性能趋势分析、Top SQL 定位、阻塞与死锁排查,原本散落在多个工具和脚本里的活,现在一个 Web 控制台全搞定。DBPilot 是一个自托管的数据库自治诊断平台。它持续采集实例的性能数据,在同一个 Web 控制台里完成日常 DBA 工作流:性能趋势与 AAS 负载拆解、Top SQL、执行计划变更跟踪、缺失索引建议、索引使用与碎片、阻塞分析、死锁分析、慢日志。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 177

Keycloak.Admin.Sdk 26.8.1-preview.3 发布:从管理 API 到应用协议的 .NET 10 SDK

如果你的项目正在使用 Keycloak 26.8.1,欢迎通过 NuGet 体验 **26.8.1-preview.3**,也欢迎提交具体接口、协议或运行环境下的使用反馈。

ChaITSimpleLove的博客 333
下一篇: 自动扫雷程序
ZeroStone
博客等级 码龄20年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值