WinForm递归获取树形菜单及右键菜单

本文记录了一名编程新手的成长历程,从无到有学习计算机语言,通过实际项目实践,逐步掌握了开发技能。分享了如何在工作中面对挑战,通过上下班时间自学提升自己,并在博客写作中与同行交流经验。重点介绍了使用Telerik控件包进行项目开发,以及在项目中实现拖动节点保存到任意节点下的具体操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一篇博客,有不到之处和抄袭嫌疑还请海涵,都是项目时累计的经验,本人新手,之前从未接触计算机语言,偶然机会下学了半年。现在上班半年,开发路上还有很多需要学习的地方,在这里希望多多认识各路老师,多多指教!趁着周末,闲极无聊就写写博客,混个面熟,也许也还能帮助别人...何乐不为?

此代码段是从一次项目中,拖动节点保存到任意节点下的片段。开发时所用的控件为Telerik控件包,此Demo没有使用到,代码也是简化版,如果有朋友需要借鉴可发邮件或者微信索取...


直接上:

效果图

             



数据表结构


Code

public partial class Form1 : Form
    {
        //数据库对象
        DBConsts db = new DBConsts();
        //利用DataTable递归
        private DataTable dt;
        public Form1()
        {
            InitializeComponent();
            //树形菜单节点右键事件
            this.treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler(treeView1_NodeMouseClick);
            //获取数据
            dt = db.GetTable();
            //递归
            GetRootNode();
        }
        /// <summary>
        /// 节点右键事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            //是否单击右键
            if (e.Button == MouseButtons.Right)
            {
                //初始化菜单
                ContextMenuStrip cm = new ContextMenuStrip();
                //菜单选项
                string[] menuItem = { "增加", "修改", "删除" };
                //循环添加菜单选项
                for (int i = 0; i < menuItem.Length; i++)
                {
                    cm.Items.Add(menuItem[i]);
                }
                //菜单选项单击事件
                cm.ItemClicked += new ToolStripItemClickedEventHandler(cm_ItemClicked);
                //绑定菜单选项到树形菜单
                this.treeView1.ContextMenuStrip = cm;
            }
        }

        /// <summary>
        /// 菜单选项单击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void cm_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            //判断是否选项为空(没试过,也许多余)
            if (e.ClickedItem == null) return;
            //判断选择项值
            if (e.ClickedItem.Text == "增加")
            {
                MessageBox.Show("这里是添加事件,比如弹出窗口");
            }
            else if (e.ClickedItem.Text == "修改")
            {
                MessageBox.Show("这里是修改事件,比如弹出窗口");
            }
            else if (e.ClickedItem.Text == "删除")
            {
                MessageBox.Show("这里是删除事件,比如弹出窗口");
            }
        }

        /// <summary>
        /// 递归根节点
        /// </summary>
        public void GetRootNode()
        {
            int rootNodeId = 0;//根节点ID
            DataRow[] rows = dt.Select("parent_node_id=" + rootNodeId + "");//找到匹配根节点ID的数据项
            TreeNode tn = null;//声明树形菜单
            //遍历根节点
            foreach (DataRow dr in rows)
            {
                tn = new TreeNode();//实例化
                tn.Tag = dr;//将节点属性绑定到Tag
                tn.Text = dr["node_name"].ToString();//节点显示内容
                tn.Name = dr["node_id"].ToString();//节点Name值
                this.treeView1.Nodes.Add(tn);//添加节点到树形菜单
                GetChildNode(tn);//递归子节点,传递根节点
            }
        }

        /// <summary>
        /// 递归子节点
        /// </summary>
        /// <param name="tn"></param>
        public void GetChildNode(TreeNode tn)
        {
            DataRow dr = (DataRow)tn.Tag;//获取节点
            int parentNodeId = (int)dr["node_id"];//定义节点编号
            DataRow[] rows = dt.Select("parent_node_id=" + parentNodeId + "");//查找匹配节点
            //遍历子节点
            foreach (DataRow item in rows)
            {
                TreeNode tnode = new TreeNode();//实例化新节点
                tnode.Tag = item;
                tnode.Text = item["node_name"].ToString();
                tnode.Name = item["node_id"].ToString();
                tn.Nodes.Add(tnode);//将新节点添加到旧节点下
                GetChildNode(tnode);//递归子节点的子节点
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值