winform中的树

来平安不是很久,公司的业务逻辑理解得并不清晰,只是做些项目里的小功能,来的第一天就开始做winform中的tree的所有节点的增删改查的操作,代码很基础,但还是想写下来留个纪念,毕竟技术不高,只能实现简单的逻辑,但我相信时间,时间会把我简单的代码变得高深,变得强大

 

 public partial class FunctionsMenuForm : Form      //一个tree窗体
    {
        #region 该类的构造函数
        public FunctionsMenuForm()
        {
            InitializeComponent();
        }
        #endregion

 

        public void Initialize()   //初始化方法
        {
            _FunMenuTree.AfterSelect += new TreeViewEventHandler(_Tree_AfterSelect);//自定义挂接一个事件
            _FunMenuTree.ExpandAll();   //展开所有树节点
            if (_FunMenuTree.SelectedNode == null ||

                GetButtonType(_FunMenuTree.SelectedNode.ImageIndex) != TouchButtonType.Menu)
            {
                _AddChidButton.Enabled = false;
            }
        }

 

        #region 具体实现这个挂接的事件
        void _Tree_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (GetButtonType(e.Node.ImageIndex) == TouchButtonType.Menu)
            {
                _AddChidButton.Enabled = true;
            }
            else
            {
                _AddChidButton.Enabled = false;
            }    
        }
        #endregion

 

        #region 定义一个方法,获取图标的索引
        private int GetImageIndex(TouchButtonType buttonType)
        {
            return (int)buttonType;
        }
         #endregion

 

        #region 根据索引再获取它的值
        private TouchButtonType GetButtonType(int imageIndex)
        {
            return (TouchButtonType)imageIndex;
        }
         #endregion

 

        #region 实现子节点上移的方法
        private void SetUPTree(TreeNode node)
        {
            //如果没有子节点,上面也没有同级的节点
            if (node == null)
            {
                MessageBox.Show("请选择您要操作的按键", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            if (node.PrevNode == null)
            {
                MessageBox.Show("已经是第一个了,不能移动。", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            TreeNode newNode = (TreeNode)node.Clone();//复制树节点和以此树节点为根的整个子树
            if (node.Parent != null)//父节点不为空
            {
                node.Parent.Nodes.Insert(node.PrevNode.Index, newNode);
            }
            else
            {
                node.TreeView.Nodes.Insert(node.PrevNode.Index, newNode);
            }
            //添加一个新的节点,这个新的节点时复制的
            node.TreeView.SelectedNode = newNode;
            this._FunMenuTree.Nodes.Remove(node);
        }
        #endregion

 

        #region 实现节点下移的方法
        private void SetDownTree(TreeNode node)
        {
            //如果没有子节点,上面也没有同级的节点
            if (node == null)
            {
                MessageBox.Show("请选择您要操作的按键", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            if (node.NextNode == null)
            {
                MessageBox.Show("已经是最后一个了,不能移动。", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            TreeNode newNode = (TreeNode)node.Clone();//复制树节点和以此树节点为根的整个子树
            if (node.Parent != null)//父节点不为空
            {
                node.Parent.Nodes.Insert(node.NextNode.Index + 1, newNode);
            }
            else
            {
                node.TreeView.Nodes.Insert(node.NextNode.Index + 1, newNode);
            }
            node.TreeView.SelectedNode = newNode;
            this._FunMenuTree.Nodes.Remove(node);
        }
        #endregion

 

        #region 点击“上移”按钮,触发的事件
        private void _RemoveUP_Click(object sender, EventArgs e)
        {
            SetUPTree(this._FunMenuTree.SelectedNode);
        }
        #endregion

 

        #region 点击"下移"按钮,触发的事件
        private void _RemoveDown_Click(object sender, EventArgs e)
        {
            //调用下移的方法
            SetDownTree(this._FunMenuTree.SelectedNode);
        }
         #endregion

        #region 点击"添加根节点"按钮,触发的事件
        private void _AddRootButton_Click(object sender, EventArgs e)
        {
            var form = new AddTreeForm(TreeOperation.RootTree);
            //给事件追加一个方法
            form.ReturnAddRoot += new EventHandler(form_ReturnAdd);
            //模式窗体打开子窗体
            form.ShowDialog();
        }
        #endregion

        #region 具体实现添加根节点的方法
        void form_ReturnAdd(object sender, EventArgs e)
        {
            AddTreeForm form = sender as AddTreeForm;
            TreeNode node = new TreeNode();
            node.Text = form.TreeNodeName;
            node.ImageIndex = GetImageIndex(form.ButtonType);
            node.SelectedImageIndex = GetImageIndex(form.ButtonType);
            this._FunMenuTree.Nodes.Add(node);
            this._FunMenuTree.SelectedNode = node;
            form.Close();
        }
         #endregion

        #region 点击"添加子节点"触发的事件
        private void _AddChidButton_Click(object sender, EventArgs e)
        {
            TreeNode node = _FunMenuTree.SelectedNode;
            if (node == null)
            {
                MessageBox.Show("请选择您要操作的按键", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            //当它选中的是菜单按钮,可以添加子节点
            if (GetButtonType(_FunMenuTree.SelectedNode.ImageIndex) == TouchButtonType.Menu)
            {
                var form = new AddTreeForm(TreeOperation.ChildTree);
                //给事件追加一个方法
                form.ReturnAddChild += new EventHandler(form_ReturnAddChild);
                form.ShowDialog();
            }          
        }
         #endregion

        #region 具体实现添加子节点的方法
        void form_ReturnAddChild(object sender, EventArgs e)
        {
            AddTreeForm form = sender as AddTreeForm;
            var node = new TreeNode();
            node.Text = form.TreeNodeName; //添加的节点的名称
            node.ImageIndex = GetImageIndex(form.ButtonType); //图片索引
            node.SelectedImageIndex = GetImageIndex(form.ButtonType);//当前选中节点的索引==图片索引
            //给树的当前选中的节点添加子节点
            this._FunMenuTree.SelectedNode.Nodes.Add(node);
            //添加子节点后,树的当前选中节点的子节点都展开
            this._FunMenuTree.SelectedNode.Expand();
            this._FunMenuTree.SelectedNode = node;
            form.Close();
        }
         #endregion

        #region 点击修改按钮,触发的事件
        private void _UpdateButton_Click(object sender, EventArgs e)
        {
            //获取当前选中的节点,如果为空
            TreeNode node = _FunMenuTree.SelectedNode;
            if (node == null)
            {
                MessageBox.Show("请选择您要操作的按键", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            //实例化子窗体,同时把枚举类型修改的操作传给它
            var form = new AddTreeForm(TreeOperation.EditTree);
            form.Initialize(node.Text, GetButtonType(node.ImageIndex));          
            //给事件挂接一个方法
            form.ReturnEditTree += new EventHandler(form_ReturnEditTree);
            //子窗体以模式窗体打开
            form.ShowDialog();
        }
         #endregion

        #region 具体实现修改的方法
        void form_ReturnEditTree(object sender, EventArgs e)
        {
            AddTreeForm form = sender as AddTreeForm;
            TreeNode node = _FunMenuTree.SelectedNode;
            if (node.Nodes.Count > 0 && form.ButtonType != TouchButtonType.Menu)
            {
                MessageBox.Show("只有菜单按键能有子按键", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            //获取到了选中节点的名称,并放在封装的属性中
            node.Text = form.TreeNodeName;
            //获取图片索引
            node.ImageIndex = GetImageIndex(form.ButtonType); //图片索引
            node.SelectedImageIndex = GetImageIndex(form.ButtonType);
            _AddChidButton.Enabled = form.ButtonType == TouchButtonType.Menu;
            form.Close();
        }
        #endregion

        #region 点击"删除"按钮触发的事件
        private void _DelButton_Click(object sender, EventArgs e)
        {
            if (this._FunMenuTree.SelectedNode != null)
            {
                this._FunMenuTree.SelectedNode.Remove();
            }
        }
        #endregion

        #region 点击"确定"按钮
        private void _OkButton_Click(object sender, EventArgs e)
        {
            this.DialogResult = System.Windows.Forms.DialogResult.OK;
        }
        #endregion

        #region  点击取消按钮触发的事件
        private void _CancelButton_Click(object sender, EventArgs e)
        {
            Close();
        }
         #endregion

        /// <summary>
        /// 加载功能按键菜单树
        /// </summary>
        /// <param name="_TouchButtons"></param>
        public void InitFuncMenuTree(List<ITouchButton> _TouchButtons)
        {
            foreach (ITouchButton btn in _TouchButtons)
            {
                TreeNode node = new TreeNode();
                node.Text = (btn as ITouchComponent).TouchTheme.Text;
                node.ImageIndex = GetImageIndex(btn.ButtonType);
                node.SelectedImageIndex = GetImageIndex(btn.ButtonType);
                switch (btn.ButtonType)
                {
                    case TouchButtonType.Menu:
                        AddChildNodes(node, btn as MenuButton);
                        _FunMenuTree.Nodes.Add(node);
                        break;
                    default:
                        _FunMenuTree.Nodes.Add(node);
                        break;
                }
            }
        }

        /// <summary>
        /// 添加菜单按键子节点
        /// </summary>
        /// <param name="parentNode"></param>
        /// <param name="menuButton"></param>
        private void AddChildNodes(TreeNode parentNode, MenuButton menuButton)
        {
            foreach (ITouchButton btn in menuButton.ChildButtons)
            {
                TreeNode node = new TreeNode();
                node.Text = (btn as ITouchComponent).TouchTheme.Text;
                node.ImageIndex = GetImageIndex(btn.ButtonType);
                node.SelectedImageIndex = GetImageIndex(btn.ButtonType);
                switch (btn.ButtonType)
                {
                    case TouchButtonType.Menu:
                        AddChildNodes(node, btn as MenuButton);
                        parentNode.Nodes.Add(node);
                        break;
                    default:
                        parentNode.Nodes.Add(node);
                        break;
                }
            }
        }

        /// <summary>
        /// 获取功能按键菜单树
        /// </summary>
        /// <returns></returns>
        public List<ITouchButton> GetFuncMenuTree()
        {
            List<ITouchButton> _TouchButtons = new List<ITouchButton>();
            foreach (TreeNode node in _FunMenuTree.Nodes)
            {
                switch (GetButtonType(node.ImageIndex))
                {
                    case TouchButtonType.Ticket:
                        TicketButton ticket = new TicketButton();
                        ticket.TouchTheme.Text = node.Text;
                        _TouchButtons.Add(ticket);
                        break;
                    case TouchButtonType.Function:
                        FunctionButton function = new FunctionButton();
                        function.TouchTheme.Text = node.Text;
                        _TouchButtons.Add(function);
                        break;
                    case TouchButtonType.Navigate:
                        NavigateButton navigate = new NavigateButton();
                        navigate.TouchTheme.Text = node.Text;
                        _TouchButtons.Add(navigate);
                        break;
                    case TouchButtonType.Menu:
                        MenuButton menu = new MenuButton();
                        menu.TouchTheme.Text = node.Text;
                        AddChildButtons(node, menu);
                        _TouchButtons.Add(menu);
                        break;
                    default :
                        break;
                }
            }
            return _TouchButtons;
        }

        /// <summary>
        /// 菜单按键添加子按键
        /// </summary>
        /// <param name="parentNode"></param>
        /// <param name="menuButton"></param>
        private void AddChildButtons(TreeNode parentNode, MenuButton menuButton)
        {
            foreach (TreeNode childNode in parentNode.Nodes)
            {
                switch (GetButtonType(childNode.ImageIndex))
                {
                    case TouchButtonType.Ticket:
                        TicketButton ticket = new TicketButton();
                        ticket.TouchTheme.Text = childNode.Text;
                        menuButton.ChildButtons.Add(ticket);
                        break;
                    case TouchButtonType.Function:
                        FunctionButton function = new FunctionButton();
                        function.TouchTheme.Text = childNode.Text;
                        menuButton.ChildButtons.Add(function);
                        break;
                    case TouchButtonType.Navigate:
                        NavigateButton navigate = new NavigateButton();
                        navigate.TouchTheme.Text = childNode.Text;
                        menuButton.ChildButtons.Add(navigate);
                        break;
                    case TouchButtonType.Menu:
                        MenuButton menu = new MenuButton();
                        menu.TouchTheme.Text = childNode.Text;
                        AddChildButtons(childNode, menu);
                        menuButton.ChildButtons.Add(menu);
                        break;
                    default:
                        break;
                }
            }
        }
    }

以上的代码功能是我在平安的第一个任务,我是在同事的帮助下完成的,做完以后还是觉得学到了些东西的,原来能力就是这样一点一点储蓄起来的,继续加油!。。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值