treelist上下节点上下移动

前几天公司做了一个项目,在我做的子模块中,有节点上下移动的功能,要求如下: 
1.上移:与同级上一节点调换位子,即与上一节点调换顺序号 
2.下移:与同级下一节点调换位子,即与下一节点调换顺序号 
这个问题想了很久,终于做出来了,虽然效率不是多么的好,但还是实现了功能,所以把它记在上面,以后要使用的时候,可以直接可以用,首先新建几个按钮,添加按钮事件,并在按钮事件上添加代码如下: 
          
/** 
         *页面刷新 
           
         */ 
        private void LoadData() 
        { 
            //清空数据连接 
            this.treeList.DataSource = null; 
            //重新加载数据库 
            this.物料分类TableAdapter1.Fill(this.dataSet_Data1.物料分类); 
            this.treeList.DataSource = this.物料分类BindingSource1; 
            
        }      

   /** 
         * 
         * 实现上移的方法 
          * 
         */ 
        private void barButtonItem上移_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) 
        { 
            //如果当前没有节点,直接终止 
            if (this.treeList.FocusedNode==null) { 
                //提示用户 
                MessageBox.Show("没有选择要移动的节点,请选择!", "提示"); 
                //程序终止 
                return; 
            } 
            //获取当前鼠标所在的节点 
            TreeListNode curnode = this.treeList.FocusedNode; 
            //获得当前鼠标所在节点的上一个节点 
            TreeListNode prenode = curnode.PrevNode; 
            //如果上一个节点为空的话,直接终止 
            if (prenode == null) { 
                //提示用户 
                MessageBox.Show("在同级中已经是最顶节点,不能移动","提示"); 
                //程序终止 
                return; 
            } 
            //获取当前鼠标所在节点的所有信息记录 
            DataRowView currow = this.treeList.GetDataRecordByNode(this.treeList.FocusedNode) as DataRowView; 
            //获取当前鼠标所在节点上一个节点的所有信息记录 
            DataRowView prerow = this.treeList.GetDataRecordByNode(this.treeList.FocusedNode.PrevNode) as DataRowView; 
            try 
            {   
                //交换两个节点的顺序号 
                prerow.BeginEdit(); 
                currow.BeginEdit(); 
                object obj = prerow["顺序号"]; 
                prerow["顺序号"] = currow["顺序号"]; 
                currow["顺序号"] = obj; 
                prerow.EndEdit(); 
                currow.EndEdit(); 
                
            } 
            catch (NullReferenceException ex) 
            { 
                //扑捉空指针异常 
                MessageBox.Show("错误信息"+ex); 

            } 
            
            //如果该节点存在父节点 
            if (curnode.ParentNode != null) 
            { 
                //在父节点的指定子节点中添加一个节点 
                curnode.ParentNode.SetValue(curnode.Id + 1, prenode); 
            } 
            else { 
                //在树形结构中的指定位置添加一个节点 
                this.treeList.AppendNode(curnode.Id + 1, prenode); 
            } 
            //数据库接受改变 
            this.dataSet_Data1.物料分类.AcceptChanges(); 
            //调用exchang方法,实现数据库中顺序号的改变 
            Exchange(currow["编号"].ToString(), prerow["编号"].ToString()); 
            //调用页面刷新方法 
            LoadData(); 
            //展开所以的树节点 
            this.treeList.ExpandAll(); 
            //把焦点置在当前节点的上一个节点上 
            this.treeList.SetFocusedNode(curnode); 
        } 
        /** 
         * 实现下移的方法 
         * 
         */ 
        private void barButtonItem下移_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) 
        { 
            //如果当前节点没有节点,直接终止 
            if (this.treeList.FocusedNode == null) { 
                //提示用户 
                MessageBox.Show("没有选择要移动的节点,请选择!","提示"); 
                //程序终止 
                return; 
            } 
            //获取当前鼠标所在的节点 
            TreeListNode curnode = this.treeList.FocusedNode; 
            //获取当前鼠标所在节点的上一个节点 
            TreeListNode nextnode = curnode.NextNode; 
            //如果所获取的下一个节点为空,直接终止 
            if (nextnode == null) { 
                //提示用户 
                MessageBox.Show("在同级中已经是最后节点,不能移动","提示"); 
                //程序终止 
                return; 
            } 
            //获取当前鼠标所在节点的所有信息记录 
            DataRowView currow = this.treeList.GetDataRecordByNode(this.treeList.FocusedNode) as DataRowView; 
            //获取当前鼠标所在节点下一个节点的所有信息记录 
            DataRowView nextrow = this.treeList.GetDataRecordByNode(this.treeList.FocusedNode.NextNode) as DataRowView; 
            try 
            { 
                //交换两个节点的顺序号 
                nextrow.BeginEdit(); 
                currow.BeginEdit(); 
                object obj = nextrow["顺序号"]; 
                nextrow["顺序号"] = currow["顺序号"]; 
                currow["顺序号"] = obj; 
                nextrow.EndEdit(); 
                currow.EndEdit(); 

            } 
            catch (NullReferenceException ex) 
            { 
                //扑捉空指针异常 
                MessageBox.Show("错误信息" + ex); 

            } 
            
            //如果存在父节点 
            if (curnode.ParentNode != null) 
            { 
                //在父节点的指定子节点上添加一个节点 
                curnode.ParentNode.SetValue(curnode.Id, nextnode); 
            } 
            else { 
                
                //不存在父节点,在树形结构中的指定位置添加一个节点 
                this.treeList.AppendNode(curnode.Id,nextnode); 
            } 
            //数据库接受改变 
            this.dataSet_Data1.物料分类.AcceptChanges(); 
            //调用exchang方法,实现数据库中顺序号的改变 
            Exchange(currow["编号"].ToString(), nextrow["编号"].ToString()); 
            //调用页面刷新方法 
            LoadData(); 
            //展开所以的树节点 
            this.treeList.ExpandAll(); 
            //把焦点置在当前节点的下一个节点上 
            this.treeList.SetFocusedNode(nextnode.NextNode); 
           
        } 

        /** 
         * 
         * 交换物料分类表字段顺序号的实现方法 
         * 
         */ 
        private void Exchange(string id1, string id2) { 
            
            //初始化顺序号1 
            int id_one = 0; 
            //初始化顺序号2 
            int id_two = 0; 
            //把从数据库中获得的值传给顺序号 
            id_one = this.物料分类TableAdapter1.ScalarQuery顺序号(Convert.ToInt32(id1)).Value; 
            id_two = this.物料分类TableAdapter1.ScalarQuery顺序号(Convert.ToInt32(id2)).Value; 
            //调用修改数据库信息的数据源 
            this.物料分类TableAdapter1.UpdateQuery修改(id_one, Convert.ToInt32(id2)); 
            this.物料分类TableAdapter1.UpdateQuery修改(id_two, Convert.ToInt32(id1)); 
        } 
这个程序做得很辛苦,值得珍藏!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值