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));
        }
这个程序做得很辛苦,值得珍藏!

你可能感兴趣的:(数据结构,Exchange)