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

news2024/11/27 2:24:59
  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 = "节点其他信息";
            #endregion

            return 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的最大值,然后加1
            int 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.coloradmin.cn/o/979851.html

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

相关文章

【Python小项目之Tkinter应用】Python的GUI库Tkinter实现随机点名工具或抽奖工具并封装成.exe可执行文件

文章目录 一、项目背景二、需求分析UI界面设计如下&#xff1a;具体需求如下&#xff1a; 二、实现思路三、项目关键代码读取excel中的人员名单实现随机滚动抽取主函数中Tkinter的界面相关操作实现窗口相关背景图设置组件相关 完整代码 四、将程序封装成.exe可执行文件将代码转…

【C++基础】6. 常量

文章目录 【 1. 常量的分类 】1.1 整型常量1.2 浮点常量1.3 字符常量1.4 字符串常量1.5 布尔常量 【 2. 常量的定义 】2.1 #define 预处理器2.2 const 关键字 常量 是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。常量可以是任何的基本数…

Linux C进程间通信(IPC)

概述 每个进程有独立的进程空间&#xff1a; 好处————安全 缺点&#xff1a;开销大&#xff08;独立的地址空间&#xff09;&#xff1b;进程的通信更加困难&#xff08;对其他进程的操作开销也大&#xff09; 广义上的进程间通信&#xff1a; A进程写给文件/数据库&am…

重拾html5

新增的position: sticky; 基于用户的滚动位置来定位&#xff0c;粘性定位的元素是依赖于用户的滚动&#xff0c;在 position:relative 与 position:fixed 定位之间切换。ie15以上的低版本不支持&#xff0c;Safari 需要使用 -webkit- prefix&#xff1b; vertical-align: midd…

ToBeWritten之数据源

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

【你问我答】Unity实现类似DNF地下城勇士的2D人物移动跳跃

文章目录 前言人物节点创建实现简单移动实现攻击效果实现跳跃人物移动跳跃完整代码人物脚底的影子效果最终运行效果源码参考完结 前言 之前有个小伙伴微信找我&#xff0c;想做一个类似DNF地下城勇士的移动跳跃功能&#xff0c;特别是关于2d的跳跃&#xff0c;之前还不是很有头…

Lua03——开发环境搭建

1 安装开发插件 在 idea 或 vscode 中安装 lua 的开发插件 EmmyLua 2 创建工程 在 idea 中创建一个新的工程 工程的类型选择 lua 输入工程名及目标目录 在工程结构的SDK中设置lua在本地安装目录 在工程结构的modules中选择 lua 3 编写第一个lua程序 在工程下添加程序包&#…

C# OpenVinoSharp PP-TinyPose 人体姿态识别

效果 项目 部分代码 using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;name…

【代码随想录day24】不同的二叉搜索树

题目 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xf…

TOWE模块化积木式定制PDU的应用优势

随着计算机网络技术发展&#xff0c;服务器、交换机、各种电子设备等关键设备的需求也日益增加&#xff0c;其承担的业务越来越关键&#xff0c;对设备所处的环境&#xff08;如机房、机柜等&#xff09;要求也越高&#xff0c;所有参与关键设备运行的设施都必须具有高可靠性与…

给苹果手机相册上锁,有3种方法!

手机跟个人的联系越来越密切&#xff0c;总有些不想让别人看到的图片。如果你使用的恰好是苹果手机&#xff0c;想要隐藏相册里的图片&#xff0c;要怎么做&#xff1f;本篇教大家3个方法。 方法1 将iOS更新至16.0版本&#xff0c;打开苹果手机的【设置】&#xff0c;点击【照…

Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装

Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装 目录 Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装 一、简单介绍 二、ControlNet 插件下载安装 三、ControlNet 插件模型下载安装 四、ControlNet 插件其他的下载安装方式 五、Co…

原来Linux这么牛:称霸全球超级电脑 500 强!

还记得之前《全球超级电脑 500 强&#xff0c;中国拿走冠亚军》新闻&#xff1f;虽然昔日超级电脑强权的美国在超级计算机竞赛中落后&#xff0c;但不管哪国打造的超级电脑&#xff0c;还有一件事情值得留意喔──几乎全部都是执行以 Linux 为基础的操作系统&#xff08;注&…

视频号小店怎么进优选联盟?聊下视频号店铺的选品细节,建议收藏

我是王路飞。 视频号小店可能还有很多人不太了解&#xff0c;但是你要知道&#xff0c;红利与机会从来不会消失。 它只会悄悄的转移&#xff0c;转移到你的认知以外&#xff0c;转移到那些新的平台&#xff0c;转移到那些被人忽略的事情里面。 而视频号小店就是目前除了抖音…

【PowerQuery】连接组的复制与粘贴

在实际的应用场景中&#xff0c;单一连接的场景非常少见。通常存在着两个或者两个以上的PowerQuery数据源。在这类场景下一个一个的复制数据源效率非常低下&#xff0c;是否存在更加有效率的数据源复制方式呢&#xff1f;接下来分享的连接组功能就是这样的概念。在PowerQuery中…

动手实践:从栈帧看字节码是如何在 JVM 中进行流转的

Java全能学习面试指南&#xff1a;https://www.javaxiaobear.cn/ 前面我们提到&#xff0c;类的初始化发生在类加载阶段&#xff0c;那对象都有哪些创建方式呢&#xff1f;除了我们常用的 new&#xff0c;还有下面这些方式&#xff1a; 使用 Class 的 newInstance 方法。使用…

【C++】—— 特殊类设计

目录 序言 &#xff08;一&#xff09;设计一个不能被拷贝的类 &#xff08;二&#xff09;设计一个只能在堆上创建对象的类 &#xff08;三&#xff09;设计一个只能在栈上创建对象的类 &#xff08;四&#xff09;设计一个不能被继承的类 总结 序言 特殊类设计是指在面…

AR产业变革中的“关键先生”和“关键力量”

今年6月的WWDC大会上&#xff0c;苹果发布了头显产品Vision Pro&#xff0c;苹果CEO库克形容它&#xff1a; 开启了空间计算时代。 AR产业曾红极一时&#xff0c;但因为一些技术硬伤又减弱了声量&#xff0c;整个产业在起伏中前行。必须承认&#xff0c;这次苹果发布Vision P…

百度文心一言可以接入微信小程序啦!

文心一言(英文名:ERNIE Bot)是百度全新一代知识增强大语言模型,文心大模型家族的新成员,能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感 …

python学习之【深拷贝】

#我的编程语言学习笔记# 前言 上一篇文章python学习之【浅拷贝】 学习了python中的浅拷贝相关内容&#xff0c;这篇文章接着学习深拷贝。 简单回顾 浅拷贝只拷贝浅层元素&#xff0c;深层元素的内存地址不改变 &#xff1b;当对拷贝产生的新的对象的浅层元素进行更改时&…