TreeList 的 增加、删除节点-----DevExpress

  private void FrmDictionaryManaged_Load(object sender, EventArgs e){// treeList1.DataSource= CreateDataTable();treeList2.DataSource = CreateTreeList();// 绑定TreeList控件到数据源treeList1.DataSource = GetData();treeList1.KeyFieldName = "ID";treeList1.ParentFieldName = "ParentID";this.treeList1.Columns[1].Caption = @"字典测试";//树的名称// 设置列为只读treeList1.Columns.Cast<TreeListColumn>().ToList().ForEach(column =>{column.OptionsColumn.ReadOnly = true;column.OptionsColumn.AllowEdit = false;});treeList1.Columns["Id"].Visible = false;}private BindingList<TreeNode> GetData(){// 此属性设为true 每个节点前会自动增加一个check框// treeList1.OptionsView.ShowCheckBoxes = true;// 此属性设为true 点击复选框时,可设置为半选状态 ??效果还未呈现出来// treeList1.OptionsBehavior.AllowIndeterminateCheckState = true;// 这里返回一个包含节点数据的BindingList// 你可以根据实际情况替换为你自己的数据源BindingList<TreeNode> data = new BindingList<TreeNode>{new TreeNode { Id = 1, Name = "性别" },// 其他节点...};return data;}public class TreeNode{public int Id { get; set; }public string Name { get; set; }}public DataTable CreateDataTable(){DataTable dt = new DataTable();//此属性设为true 每个节点前会自动增加一个check框treeList1.OptionsView.ShowCheckBoxes = true;//此属性设为true 点击复选框时,可设置为半选状态 ??效果还未呈现出来treeList1.OptionsBehavior.AllowIndeterminateCheckState = true;dt.Columns.Add("ID");dt.Columns.Add("PARENTID");dt.Columns.Add("NAME");//为此表增加数据DataRow dr1 = dt.NewRow();dr1["ID"] = 1;dr1["PARENTID"] = 1;dr1["NAME"] = "类目1";dt.Rows.Add(dr1);DataRow dr2 = dt.NewRow();dr2["ID"] = 2;dr2["PARENTID"] = 1;dr2["NAME"] = "商品1";dt.Rows.Add(dr2);DataRow dr3 = dt.NewRow();dr3["ID"] = 3;dr3["PARENTID"] = 1;dr3["NAME"] = "商品2";dt.Rows.Add(dr3);DataRow dr31 = dt.NewRow();dr31["ID"] = 7;dr31["PARENTID"] = 1;dr31["NAME"] = "类目3";dt.Rows.Add(dr31);DataRow dr4 = dt.NewRow();dr4["ID"] = 4;dr4["PARENTID"] = 4;dr4["NAME"] = "类目2";dt.Rows.Add(dr4);DataRow dr5 = dt.NewRow();dr5["ID"] = 5;dr5["PARENTID"] = 4;dr5["NAME"] = "商品1";dt.Rows.Add(dr5);DataRow dr6 = dt.NewRow();dr6["ID"] = 6;dr6["PARENTID"] = 4;dr6["NAME"] = "商品2";dt.Rows.Add(dr6);this.treeList1.DataSource = dt;this.treeList1.KeyFieldName = "ID";this.treeList1.ParentFieldName = "PARENTID";this.treeList1.Columns[0].Caption = "测试";//树的名称return dt;}public DataTable CreateTreeList(){DataTable dt = new DataTable();#region TreeList属性设置//节点前显示复选框this.treeList2.OptionsView.ShowCheckBoxes = true;//此属性设为true 点击复选框时,可设置为半选状态treeList1.OptionsBehavior.AllowIndeterminateCheckState = true;#endregion#region 在TreeList中增加列//用于标识当前节点和当前节点的父节点dt.Columns.Add("ID");dt.Columns.Add("PARENTID");//第一列数据的名称dt.Columns.Add("NAME");//第二列(节点编码的名称)dt.Columns.Add("CODE");//第三列(其他)dt.Columns.Add("OTHERS");#endregion#region 添加数据//第一行数据DataRow dr1 = dt.NewRow();dr1["ID"] = 1;dr1["PARENTID"] = DBNull.Value;dr1["NAME"] = "根节点1";dr1["CODE"] = "根节点1编码";dr1["OTHERS"] = "根节点1的其他信息";dt.Rows.Add(dr1);//第二行数据DataRow dr2 = dt.NewRow();dr2["ID"] = 2;dr2["PARENTID"] = 1;dr2["NAME"] = "当前节点2";dr2["CODE"] = "当前节点2编码";dr2["OTHERS"] = "当前节点2的其他信息";dt.Rows.Add(dr2);//第三行数据DataRow dr3 = dt.NewRow();dr3["ID"] = 3;dr3["PARENTID"] = 1;dr3["NAME"] = "当前节点3";dr3["CODE"] = "当前节点3编码";dr3["OTHERS"] = "当前节点3的其他信息";dt.Rows.Add(dr3);//第四行数据DataRow dr4 = dt.NewRow();dr4["ID"] = 4;dr4["PARENTID"] = DBNull.Value;dr4["NAME"] = "根节点2";dr4["CODE"] = "根节点2编码";dr4["OTHERS"] = "根节点2的其他信息";dt.Rows.Add(dr4);//第五行数据DataRow dr5 = dt.NewRow();dr5["ID"] = 5;dr5["PARENTID"] = 4;dr5["NAME"] = "当前节点5";dr5["CODE"] = "当前节点5编码";dr5["OTHERS"] = "当前节点5的其他信息";dt.Rows.Add(dr5);//第六行数据DataRow dr6 = dt.NewRow();dr6["ID"] = 6;dr6["PARENTID"] = 4;dr6["NAME"] = "当前节点6";dr6["CODE"] = "当前节点6编码";dr6["OTHERS"] = "当前节点6的其他信息";dt.Rows.Add(dr6);#endregion#region 绑定数据源并设置列名this.treeList2.DataSource = dt;this.treeList2.KeyFieldName = "ID";this.treeList2.ParentFieldName = "PARENTID";//这句一定要写在上面两句的下面this.treeList2.Columns[0].Caption = "节点名称";this.treeList2.Columns[1].Caption = "节点编码";this.treeList2.Columns[2].Caption = "节点其他信息";#endregionreturn dt;}private void 添加ToolStripMenuItem_Click(object sender, EventArgs e){FrmDictionaryTreeEdit frm = new FrmDictionaryTreeEdit();frm.ShowDialog();if (frm.DialogResult != DialogResult.OK)return;// 创建新节点var newNode = new TreeNode { Id = GetNewNodeId(), Name = frm.TypeName };// 获取选中的节点TreeListNode selectedNode = treeList1.FocusedNode;//if (selectedNode == null)//{// 如果没有选中节点,添加到根节点treeList1.AppendNode(new object[] { newNode.Id, newNode.Name }, null);//}//else//{//    // 如果有选中节点,添加为选中节点的子节点//    treeList1.AppendNode(new object[] { newNode.Id, newNode.Name }, selectedNode);//    selectedNode.Expanded = true; // 展开选中节点以显示子节点//}}private void 修改ToolStripMenuItem_Click(object sender, EventArgs e){TreeListNode selectedNode = treeList1.FocusedNode;if (selectedNode != null){FrmDictionaryTreeEdit frm = new FrmDictionaryTreeEdit();// 获取选中节点的数据int nodeId = Convert.ToInt32(selectedNode.GetValue("ID"));frm.TypeName = selectedNode.GetValue("Name").ToString();frm.ShowDialog();if (frm.DialogResult != DialogResult.OK)return;string editedName = frm.TypeName;// 更新TreeList中的节点数据selectedNode.SetValue("Name", editedName);}}private void 删除ToolStripMenuItem_Click(object sender, EventArgs e){TreeListNode selectedNode = treeList1.FocusedNode;if (selectedNode != null){// 删除选中的节点treeList1.DeleteNode(selectedNode);}}private int GetNewNodeId(){// 这里可以根据需要生成新节点的ID,确保其唯一性// 例如,你可以查询已存在的节点ID的最大值,然后加1int maxId = (from TreeListNode node in treeList1.Nodes select Convert.ToInt32(node.GetValue("ID"))).Concat(new[] { -1 }).Max();return maxId + 1;}

控件:TreeList ,GirdControl,ContextMenuStrip

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

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

相关文章

两种解法解决 LeetCode 27. 移除元素【C++】

移除元素 27. 移除元素题目&#xff1a;[移除元素](https://leetcode.cn/problems/remove-element/description/)示例和提示&#xff1a;解法&#xff1a;1. 暴力解法 2. 快慢指针 27. 移除元素 题目&#xff1a;移除元素 示例和提示&#xff1a; 解法&#xff1a; 1. 暴力解…

嵌入式面试/笔试C相关总结

1、存储 单片机端编译后分为code ro rw zi几个区域&#xff0c;其中code是执行文件&#xff0c;ro(read only)只读区域&#xff0c;存放const修饰常量、字符串。rw(read write)存放已初始化变量。zi存放未初始化变量。编译完成后bin大小为coderorw。运行时所需内存为rwzi。 在电…

【狂神】Spring5笔记(四)之Mybatis和事物的整合

一、整合Mybatis方式一 目录结构&#xff1a; 大致内容结构&#xff1a; 主要难点就在于applicationContext.xml中相关配置的理解 代码图片如下 这个类就专门用于对象的创建就可以了 测试类&#xff1a; 实现类&#xff1a; SqlSessionTemplate 二、整合Mybatis方式二 相关代码…

vue3中使用viewerjs实现图片预览效果

vue3中使用viewerjs实现图片预览效果 1、前言2、实现效果3、在vue3项目中使用viewer.js3.1 安装3.2 在main.js中引入3.3 组件中使用 1、前言 viewer.js是一款开源的图片预览插件&#xff0c;功能十分强大: 支持移动设备触摸事件支持响应式支持放大/缩小支持旋转&#xff08;类…

SpringMVC常用注解、参数传递、返回值

目录 前言 一、常用注解 二、参数传递 ​编辑 1. 基础类型String类型 2. 复杂类型 3. RequestParam 4. PathVariable 5.RequestBody 6. RequestHeader 三、方法返回值 一&#xff1a;void 二&#xff1a;String 三&#xff1a;Stringmodel 四&#xff1a;ModelAndVi…

MySQL数据库和表的操作

数据库基础 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 1、文件的安全性问题 2、文件不利于数据查询和管理 3、文件不利于存储海量数据 4、文件在程序中控制不方便 数据库存储介质&#xff1a; 磁盘 内存 为了解决上…

STM32微控制器的低功耗模式

STM32微控制器的低功耗模式(Low-power modes):Sleep mode、Stop mode 和 Standby mode。 1.1 Sleep Mode(睡眠模式): 把STM32微控制器当作一位劳累的工人,他在工作过程中需要短暂的休息。在Sleep模式下,微控制器会关闭一部分电路,减小功耗,但仍然保持对中央处理单…

代码管理记录(二):Github代码上传实操

文章目录 Git介绍通过Git如何将本地代码上传错误汇总 Git介绍 Git是一个分布式版本控制系统&#xff0c;用于跟踪代码的修改和协同开发。它提供了强大的分支管理、版本控制和合并功能。作为一个上传GitHub的工具&#xff0c;Git可以轻松地将本地代码推送到GitHub远程仓库&…

第一天 关于项目遇到的问题和缺少的知识点

1.配置静态资源映射 配置文件使用的都是配置类方式 创建配置类WebMvcConfig,设置静态资源映射 用于在Springboot项目中, 默认静态资源的存放目录为 : "classpath:/resources/", "classpath:/static/", "classpath:/public/" ; 而在我们的项目中静…

SpringMVC入门的注解、参数传递、返回值和页面跳转---超详细教学

前言&#xff1a; 欢迎阅读Spring MVC入门必读&#xff01;在这篇文章中&#xff0c;我们将探索这个令人兴奋的框架&#xff0c;它为您提供了一种高效、灵活且易于维护的方式来构建Web应用程序。通过使用Spring MVC&#xff0c;您将享受到以下好处&#xff1a;简洁的代码、强大…

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3新功能

New Feature Upsert 功能 支持用户通过 upsert 接口更新或插入数据。已知限制,自增 id 不支持 upsert;upsert 是内部实现是 delete + insert所以性能上会有一定损耗,如果明确知道是写入数据的场景请继续使用 insert。 Range Search 功能 支持用户通过输入参数指定 search 的…

【算法专题突破】双指针 - 和为s的两个数字(6)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;剑指 Offer 57. 和为s的两个数字 - 力扣&#xff08;Leetcode&#xff09; 这道题题目就一句话但是也是有信息可以提取的&#xff0c; 最重要的就是开始的那句话&#…

【小吉测评】高效简洁的数据库管控平台—CloudQuery

文章目录 &#x1f384;CloudQuery是什么&#x1f6f8;CloudQuery支持的数据源类型&#x1f354;CloudQuery社区地址&#x1f33a;如何使用&#x1f6f8;参考官方文档&#x1f6f8;参考视频教程&#x1f388;点击免费下载&#x1f388;立即下载即可&#x1f388;使用服务器完成…

Android——数据存储(一)(二十一)

1. 数据存储 1.1 知识点 &#xff08;1&#xff09;掌握Android数据存储的分类&#xff1b; &#xff08;2&#xff09;可以使用SharedPreferences存储数据。 1.2 具体内容 对于我们数据的存储而言&#xff0c;Android一共提供了5个数据存储的方式&#xff1a;SharedPrefe…

任天堂开发全新独立VR设备,或为下一代主机?将提供混合现实体验

根据爆料人Nash Weedle在X平台上的发文&#xff0c;我们得知任天堂正在秘密开发一款全新的独立VR设备&#xff0c;该设备将拥有一块MicroLED屏幕&#xff0c;并且独立于任天堂传闻中的下一代主机。与此同时&#xff0c;谷歌也参与了这款VR产品的研发工作。 这一新的VR设备被设计…

Java反序列化漏洞复现(weblogic和s2)

文章目录 weblogic启动环境漏洞扫描漏洞复现 S2-045启动环境漏洞复现 前提条件&#xff1a; 1.安装docker docker pull medicean/vulapps:j_joomla_22.安装docker-compose docker run -d -p 8000:80 medicean/vulapps:j_joomla_23.下载vulhub weblogic 启动环境 到下面路径下…

SpringBoot的HandlerInterceptor拦截器使用方法

一、创建拦截器 通过实现HandlerInterceptor接口创建自己要使用的拦截器 import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.…

Vue + Element UI 前端篇(十五):嵌套外部网页

Vue Element UI 实现权限管理系统 前端篇&#xff08;十五&#xff09;&#xff1a;嵌套外部网页 嵌套外部网页 在有些时候&#xff0c;我们需要在我们的内容栏主区域显示外部网页。如查看服务端提供的SQL监控页面&#xff0c;接口文档页面等。 这个时候就要求我们的导航菜…

让你的编程之路更加顺畅——推荐一款前端编程神器

引子&#xff1a;在当今的数字化时代&#xff0c;编程已经成为一种不可或缺的技能。而前端开发&#xff0c;作为整个应用程序的“门面”&#xff0c;更是需要开发人员具备优秀的网页设计和编程能力。今天&#xff0c;我要向大家推荐一款专门为前端开发者打造的APP&#xff0c;它…

指令系统(408)

一、拓展操作码指令格式 【2017 统考】某计算机按字节编址&#xff0c;指令字长固定且只有两种指令格式&#xff0c;其中三地址指令29条、二地址指令107条&#xff0c;每个地址字段6位&#xff0c;则指令字长至少应该是&#xff08; A&#xff09; A、24位 B、26位 …