当前位置: 首页 > news >正文

C#中XML文档与Treeview控件操作的数据同步

  在前文《C#使用XML和Treeview结合实现复杂数据采集功能》中,使用Treeview展示了XML的数据,问题是如果在Treeview上进行了操作,怎样同步更改XML数据的内容呢?

 

  这个问题看似简单,实现起来有一点小麻烦。

  要实现的操作功能:

  ⑴如果点击了Radio,即单选图标,需要在XML文档中找到该节点,将同级的所有节点的选择属性清空,然后将该节点的选择属性置为“true”。

  ⑵如果点击了Checkbox,即多选图标,需要在XML文档中找到该节点,然后将该节点的选择属性置为“true”。

  ⑶如果点击了textbook,即文本输入图标,需要在XML文档中找到该节点,然后改写该节点的value属性值。

  ⑷点击标签,只进行图标替换动作,不更改XML内容。

  ⑸只要点击Radio、Checkbox、textbook,都需要进行自动计算。自动计算规则:没有计算公式属性,那么父节点等于子节点的value之和,如果有计算公式,需要根据计算公式进行结果获取。

  这里记录解决⑴、⑵、⑶的代码实现。

  在treeView1_MouseDown(object sender, MouseEventArgs e)事件中的具体实现代码:

//在XML内容中进行操作,找到该子项目并修改子项目的属性值,就是修改XML文档的内容
//找到该节点
TreeNode SelectedNode =treeView1.GetNodeAt(e.X, e.Y);
//得到全路径名
string StrCurrentPath= SelectedNode.FullPath;
//找第一个"\"
int FirstIndex = StrCurrentPath.IndexOf("\\");
//找最后一个"\"
int LastIndex =StrCurrentPath.LastIndexOf("\\");
//得到在XML文档中父节点的全路径名称
string StrParentPath= StrCurrentPath.Substring(FirstIndex+1,LastIndex - FirstIndex -1);
//得到当前节点名称
string StrCurrentNodeName= StrCurrentPath.Substring(LastIndex+1);
//找到节点
XmlNode TargetNode = FindNodeAtXmlContent(XmlDoc.DocumentElement, StrParentPath);
//处理节点信息
HandleNodeInfoAtXmlContent(TargetNode, StrCurrentNodeName);
//保存处理后的XML文档内容
StrXmlContent = XmlDoc.OuterXml;

  查找函数,根据被查找的节点和路径找到该节点。

  一般情况下使用递归来进行查找,这里使用的循环:

  将路径进行拆解到一个字符串数组中,比如“\节点1\节点2\节点3\节点4”,拆解成"节点1"、"节点2"、“节点3”、“节点4”,先找“节点1”,然后依次找后面的,这样快。

  实现的代码:

        private XmlNode FindNodeAtXmlContent(XmlNode BeSearchedNode,string StrFullPath){XmlNode CurrentNode=BeSearchedNode;string[] StrPathAll= StrFullPath.Split('\\');foreach(string StrPath in StrPathAll){bool Finded= false;foreach(XmlNode xmlNode in CurrentNode.ChildNodes){if (xmlNode.Name.Trim()==StrPath.Trim()){Finded = true;CurrentNode= xmlNode;//找到对应的节点break;}}if(!Finded){return null;//没有找到对应的节点}}return CurrentNode;}

  处理函数,如果找到了父节点,就更改相关信息:

        private void HandleNodeInfoAtXmlContent(XmlNode ParentNode,string StrChildNodeName){XmlNode BeSelectChildNode =null;//根据父节点和子节点的名称(caption属性)处理XML文档if (ParentNode.Attributes["type"] != null){string StrNodeType = ParentNode.Attributes["type"].Value;if (StrNodeType=="Radio"){foreach(XmlNode ChildNode in ParentNode.ChildNodes){textBox2.Text += "节点caption:" + ChildNode.Attributes["caption"].Value+Environment.NewLine;//单选,先将父节点下的子节点的select属性全部删除if (ChildNode.Attributes["select"] != null){ChildNode.Attributes.Remove(ChildNode.Attributes["select"]);}//找到子节点if (ChildNode.Attributes["caption"].Value ==StrChildNodeName.Trim()){BeSelectChildNode = ChildNode;}}//添加select属性XmlAttribute SelectedAttr = XmlDoc.CreateAttribute("select");SelectedAttr.Value= "true";BeSelectChildNode.Attributes.Append(SelectedAttr);                    }if (StrNodeType == "Checkbox"){foreach (XmlNode ChildNode in ParentNode.ChildNodes){//多选,找到并添加select属性//找到子节点if (ChildNode.Attributes["caption"].Value == StrChildNodeName.Trim()){BeSelectChildNode = ChildNode;}}//添加select属性XmlAttribute SelectedAttr = XmlDoc.CreateAttribute("select");SelectedAttr.Value = "true";BeSelectChildNode.Attributes.Append(SelectedAttr);}if (StrNodeType == "Textbox"){foreach (XmlNode ChildNode in ParentNode.ChildNodes){//文本输入框,找到并更改value属性//找到子节点if (ChildNode.Attributes["caption"].Value == StrChildNodeName.Trim()){BeSelectChildNode = ChildNode;}}//更改value属性属性XmlAttribute SelectedAttr = XmlDoc.CreateAttribute("value");SelectedAttr.Value = StrCurrentTextboxValue;BeSelectChildNode.Attributes.Append(SelectedAttr);}}}

  通过上面的代码,就可以做到Treeview的操作与实际XML文档内容的同步更新和一致。

相关文章:

C#中XML文档与Treeview控件操作的数据同步

在前文《C#使用XML和Treeview结合实现复杂数据采集功能》中,使用Treeview展示了XML的数据,问题是如果在Treeview上进行了操作,怎样同步更改XML数据的内容呢? 这个问题看似简单,实现起来有一点小麻烦。 要实现的操作功能…...

【Java Web基础】mvn命令、Maven的安装与配置

本文极大程度上来自Maven安装(超详解),但是担心安的过程中遇到什么不一样的问题,顺便加深印象,所以还是打算自己弄一篇。 目录 第一步:Download Maven第二步:解压与安装2.1 解压2.2 安装 第一步:Download …...

加强Web应用程序安全:防止SQL注入

数据库在Web应用程序中存储和组织数据时起着至关重要的作用,它是存储用户信息、内容和其他应用程序数据的中央存储库。而数据库实现了高效的数据检索、操作和管理,使Web应用程序能够向用户提供动态和个性化的内容。然而,数据库和网络应用程序…...

【云原生】k8s中Contrainer 生命周期回调/策略/指针学习

个人主页:征服bug-CSDN博客 kubernetes专栏:kubernetes_征服bug的博客-CSDN博客 目录 1 容器生命周期 2 容器生命周期回调/事件/钩子 3 容器重启策略 4 自定义容器启动命令 5 容器探针 1 容器生命周期 Kubernetes 会跟踪 Pod 中每个容器的状态&am…...

electron+vue3全家桶+vite项目搭建【25】使用electron-updater自动更新应用

文章目录 引入实现效果实现步骤引入依赖配置electron-buidler文件封装版本升级工具类主进程调用版本更新校验渲染进程封装方法调用 测试版本更新 引入 demo项目地址 electron-updater官网 我们不可能每次发布新的版本都让用户去手动下载安装最新的包,而是应用可以…...

SQL 表别名 和 列别名

列表名 列表名之后 order by 可以用别名 也可以用原名, where 中不能用别名的 SQL语句执行顺序: from–>where–>group by -->having — >select --> order 第一步:from语句,选择要操作的表。 第二步&#xff1…...

面试之快速学习c++11-函数模版的默认模版参数,可变模版,tuple

//学习地址&#xff1a; http://c.biancheng.net/view/3730.html 函数模版的默认模版参数 在 C98/03 标准中&#xff0c;类模板可以有默认的模板参数&#xff0c;如下&#xff1a; template <typename T, typename U int, U N 0> struct TestTemplateStruct {};但是…...

Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】

一、VsCode 常见的配置 1、取消更新 把插件的更新也一起取消了 2、设置编码为utf-8&#xff1a;默认就是了&#xff0c;不用设置了 3、设置常用的开发字体&#xff1a;Consolas, 默认就是了&#xff0c;不用设置了 字体对开发也很重要&#xff0c;不同字体&#xff0c;字母形…...

源码编译安装gcc

摘要&#xff1a; 在编译开源的FunASR项目的C代码时&#xff0c;可能要求的gcc版本不符合&#xff0c;需要升级gcc版本&#xff0c;但是从网上搜索升级gcc方式&#xff0c;大部分都是通过简单的yum命令方式升级&#xff0c;我也尝试了这个方式&#xff0c;这种方式并不能升级到…...

pc文件上传

1.代码&#xff1a; <template><div><el-upload:multiple"true":auto-upload"true":headers"headers":action"uploadFileUrl":before-upload"handleBeforeUpload":on-error"handleUploadError":o…...

Vue3_对响应式对象解构赋值之后失去响应性

官网toRefs() :响应式 API&#xff1a;工具函数 | Vue.js toRefs 在调用时只会为源对象上可以枚举的属性创建 ref。如果要为可能还不存在的属性创建 ref&#xff0c;请改用 toRef。 setup(){const state reactive({name:"张三"age:14})const stateAsToRefs toRef…...

3d 地球与卫星绕地飞行

1 创建场景 2 创建相机 3 创建地球模型 4 创建卫星中心 5 创建卫星圆环及卫星 6 创建控制器 7 创建渲染器 <template><div class"home3dMap" id"home3dMap"></div> </template><script> import * as THREE from three impo…...

Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)

文章目录 一、图像平移二、图像旋转2.1 求旋转矩阵2.2 求旋转后图像的尺寸2.3手工实现图像旋转2.4 opencv函数实现图像旋转 三、图像翻转3.1左右翻转3.2、上下翻转3.3 上下颠倒&#xff0c;左右相反 4、错切变换4.1 实现错切变换 5、仿射变换5.1 求解仿射变换5.2 OpenCV实现仿射…...

第十次CCF计算机软件能力认证

第一题&#xff1a;分蛋糕 小明今天生日&#xff0c;他有 n 块蛋糕要分给朋友们吃&#xff0c;这 n 块蛋糕&#xff08;编号为 1 到 n&#xff09;的重量分别为 a1,a2,…,an。 小明想分给每个朋友至少重量为 k 的蛋糕。 小明的朋友们已经排好队准备领蛋糕&#xff0c;对于每个朋…...

【敏捷开发】测试驱动开发(TDD)

测试驱动开发&#xff08;Test-Driven Development&#xff0c;简称TDD&#xff09;是敏捷开发模式中的一项核心实践和技术&#xff0c;也是一种设计方法论。TDD有别于以往的“先编码&#xff0c;后测试”的开发模式&#xff0c;要求在设计与编码之前&#xff0c;先编写测试脚本…...

骑砍二 ATC MOD 使用教程与应用案例解析

骑砍二 ATC MOD 使用教程与应用案例解析 作者&#xff1a;blibli-财不外漏 / NEXUSMODS-PuepleKarmen 案例MOD依赖&#xff1a;ATC - Adonnay’s Troop Changer & AEW - Adonnay’s Exotic Weaponry & New Armor 文本编辑工具&#xff1a;VS Code&#xff08;推荐使用&…...

python和c语言哪个好上手,c语言和python语言哪个难

大家好&#xff0c;本文将围绕python和c语言哪个更值得学展开说明&#xff0c;python语言和c语言哪个简单是一个很多人都想弄明白的事情&#xff0c;想搞清楚c语言和python语言哪个难需要先了解以下几个事情。 前言 新手最容易拿来讨论的三个语言&#xff0c;具体哪个好&#x…...

智能优化算法 | Matlab实现鲸鱼优化算法(Whale Optimization Algorithm)(内含完整源码)

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 智能优化算法 | Matlab实现鲸鱼优化算法(Whale Optimization Algorithm)(内含完整源码) 研究内容 步骤 1:设置鲸鱼数量 N 和算法的最大迭代次数 tmax,初始化位置信息; 步骤 2:计算每条鲸鱼的适应度,…...

Android随笔-VPN判断

Android中判断当前网络是否为VPN /*** 判断当前网络是否为VPN* param context* return*/public static boolean hasVPN(Context context) {// 查询网络状态&#xff0c;被动监听网络状态变化ConnectivityManager cm (ConnectivityManager) context.getSystemService(Context.C…...

【黑马头条之kafka及异步通知文章上下架】

本笔记内容为黑马头条项目的kafka及异步通知文章上下架部分 目录 一、kafka概述 二、kafka安装配置 三、kafka入门 四、kafka高可用设计 1、集群 2、备份机制(Replication&#xff09; 五、kafka生产者详解 1、发送类型 2、参数详解 六、kafka消费者详解 1、消费者…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...