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

news2024/11/18 9:38:38

  在前文《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文档内容的同步更新和一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/837670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2023年电赛国一必备】B题报告模板--可直接使用

任务 图1 任务内容 要求 图2 基本要求内容 图3 发挥部分内容 说明 图4 说明内容 评分标准 图5 评分内容 正文 (部分) 摘要 本实验的目标是设计并制作一个同轴电缆长度与终端负载检测装置,通过使用STM32主控和模拟电路进行实现。装置需…

基于EMQ的企信说明文档(包含EMQ安装步骤、JAVA后端、VUE前端)

基于EMQ的企信说明文档(包含EMQ安装步骤、JAVA服务端、VUE客户端) 整体数据流图: VUE简单demo: 什么是EMQ EMQ X R3.1 (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 语言平台开发,支持大规模连接和分布式集群,简单来说&#…

angular material 表格分页 mat-paginator,设置分页大小标签内容

当我们不想要material 样式自带的文字时: 可以这样操作: import { MatPaginatorIntl } from angular/material/paginator;constructor(private paginator: MatPaginatorIntl) {paginator.itemsPerPageLabel 这里输入分页需要的提示文字; }

PHP国外在线教育系统源码 在线课程系统源码 直播课程系统源码提供在线课程,现场课程,测验

Proacademy是在线教育一体化的解决方案,用于创建类似于Udemy、Skillshare、Coursera这种在线教育市场。 这个平台提供在线课程,现场课程,测验等等,并有一个基于实际业务需要的高级认证插件,程序基于Laravel强大的安全框…

第R2周 - LSTM火灾温度预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 我的环境: 语言环境:Python3.10.7编译器:VScode深度学习环境:TensorFlow 2.13.0 一、前期工作: …

电脑第一次使用屏幕键盘

操作流程 1.在键盘上同时按WinR打开运行; 2.输入control 3.找到设置中心 4.点击屏幕键盘 效果 具体怎么使用 我不咋清除 简单 测试了一下 可以用鼠标点击屏幕键盘的按键 用键盘 按字母键和数字键 是和屏幕键盘不同步的 其他 tab、shift、后退、enter好像同步

Dubbo+Zookeeper使用

说明:Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。 本文介绍Dubbo的简单使用及一些Dubbo功能特性,注册中心使用的是ZooKeeper,可在…

案例实践:小红书APP出现闪退问题,接口测试怎么做?(二)

Postman实现接口功能测试 新增货品接口实战 1、填写接口请求4要素: 由于货品新增接口文档找不到接口请求4要素中的:请求方法、请求地址和请求头,故,使用Fiddler抓包获取,获取结果如下: 1)请求…

选择适合的项目管理工具,高效完成项目管理

很多项目经理想要知道项目计划执行的情况,大部分都是通过在线EXCEL文档,大家去更新进度,或者通过各种群消息,邮件,电话去通知项目经理项目执行进度,好一点的企业可能有专业的项目管理软件去收集进度&#x…

WebAPI文档与自动化测试

目录 1、控制器,项目属性里需要勾选输出Xml文档选项: 2、下载文档的网页数据 3、运行访问网址 4、接口测试: 5、批量测试: 6、微服务文档 总结: 本篇介绍框架的WebAPI文档与自动化测试 1、控制器,项…

Elasticsearchr入门

首先在官网下载elasticsearch8.9版本&#xff0c;以及8.9版本的kibana。 解压&#xff0c;点击es8.9bin目录下的elasticsearch.bat文件启动es 如图所示即为成功。 启动之后打开idea&#xff0c;添加依赖 <dependency><groupId>com.fasterxml.jackson.core</g…

【二开版】大魔王7.0-PHP来客云在线客服系统

前言 由于即时通讯软件不是存在敏感词汇就是收费&#xff0c;想找一个网上开源的又麻烦&#xff0c;来客云在线客服系统网上到处都能找到&#xff0c;但是由于开发时间太久&#xff0c;像公众号的一些消息服务受限不能用了&#xff0c;这一套客服系统只能做到基本的聊天对话功…

华为OD机试真题 Java 实现【最长的完全交替连续方波信号】【2023 B卷 200分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…

TP DP PP 并行训练方法介绍

这里写目录标题 张量并行TP流水线并行 PPnaive模型并行GPipePipeDream 数据并行DPFSDP 张量并行TP 挖坑 流水线并行 PP 经典的流水线并行范式有Google推出的Gpipe&#xff0c;和微软推出的PipeDream。两者的推出时间都在2019年左右&#xff0c;大体设计框架一致。主要差别为…

Java阶段五Day19

Java阶段五Day19 问题解析 需求单查询列表功能的bug 业务逻辑&#xff1a; 需要用户登录&#xff0c;师傅入驻&#xff0c;审核入驻通过 查询师傅详情&#xff08;areaIds&#xff0c;categoryIds&#xff09; demand-server-dao-impl 包含持久层实现 requestOrderMappe…

JavaScript数据结构与算法——栈

文章目录 一、初始栈结构1.1 特性1.2 注意事项 二、栈结构的封装2.1 封装简单栈结构2.2 利用栈将十进制转二进制 一、初始栈结构 1.1 特性 类似于汉诺塔&#xff0c;后进先出&#xff0c;每次只能操作栈顶的元素。关键词&#xff1a;压栈、退栈 简单示意图&#xff1a; 1.…

java编码规范 和 数据库规范

总体规约以《阿里巴巴Java开发手册》为主&#xff0c;请开发人员至少阅读一遍该手册。 一、java编码规范 1.1 java基础规范 多使用 jdk自带库和被验证的第三方库的类和函数&#xff0c;不要用野路子来的jar包 无论是包、类、方法、变量&#xff0c;见名知意 1.2 在线文档规…

AlmediaDev Style Controls Crack

AlmediaDev Style Controls Crack StyleControls是一个稳定、强大的包(超过100个组件)&#xff0c;它使用经典绘图、系统主题、GDI和VCL样式。该软件包包含扩展标准VCL控件的独特解决方案&#xff0c;还包含许多独特的高级控件&#xff0c;用于创建具有Fluent UI模糊背景的现代…

AI的蓬勃发展,程序员的末日?

一、AI是什么&#xff1f;AI有哪些类型&#xff1f;生成式AI是什么&#xff1f;未来AI有哪些发展方向&#xff1f; ● AI是人工智能(Artificial Intelligence)的缩写,是比人类更强大的算法与软硬件系统,能模拟出人类智力相关的某些行为与功能。 ● AI主要分为三大类型: 机器学…

Docker Compose 使用方法

目录 前言 安装 Docker Compose Ubuntu 安装与更新 Red Hat 安装与更新 验证是否安装 Docker Compose 创建 docker-compose.yml 文件 创建一个MySQL 与 tomcat 示例 使用Docker Compose启动服务 前言 Docker Compose 是一个工具&#xff0c;旨在帮助定义和 共享多容器…