Winfrom treeview拖拽功能

来源:互联网 发布:软件行业平均毛利率 编辑:程序博客网 时间:2024/06/16 02:25

设置控件的可拖拽属性为true


实现三个事件

        /*         当鼠标拖拽某节点时         */        private void tvQueuing_ItemDrag(object sender, ItemDragEventArgs e)        {            DragWho = 1;            TreeNode tn = e.Item as TreeNode;            //当按住鼠标左键拖动节点时移动节点。            if (e.Button == MouseButtons.Left)            {                DoDragDrop(e.Item, DragDropEffects.Move);            }            //else if (e.Button == MouseButtons.Right)            //{            //    DoDragDrop(e.Item, DragDropEffects.Copy);            //}        }

  /*         当鼠标拖拽节点进入控件区域内时         */        private void tvQueuing_DragEnter(object sender, DragEventArgs e)        {            //三种都可以            //if (e.Data.GetDataPresent(typeof(TreeNode)))            //    e.Effect = DragDropEffects.Move;            //else            //    e.Effect = DragDropEffects.None;            ////e.Effect = DragDropEffects.Move;            e.Effect = e.AllowedEffect;                 }

真正实现的操作:

     private void tvQueuing_DragDrop(object sender, DragEventArgs e)        {            Point Position = new Point(0, 0);            TreeNode myNode = null;//选中的节点                      if (e.Data.GetDataPresent(typeof(TreeNode)))            {                myNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));            }            else            {                MessageBox.Show("error");            }            Position.X = e.X;            Position.Y = e.Y;            Position = tvQueuing.PointToClient(Position);            TreeNode DropNode = tvQueuing.GetNodeAt(Position);//落下的节点            //DropNode.BackColor = Color.Red;            //DropNode.ForeColor = Color.Red;            // 确定落下的节点不是被拖拽节点本身或者被拖拽节点的子节点            if (!DropNode.Equals(myNode) && !ContainsNode(DropNode, myNode))            {                if (e.Effect == DragDropEffects.Move)                {                    DragNodeView(myNode, DropNode, 1);                }                else if (e.Effect == DragDropEffects.Copy)                {                    myNode.Nodes.Add((TreeNode)DropNode.Clone());                }                myNode.Expand();            }                }

 //确定一个节点是否是父节点。        private bool ContainsNode(TreeNode node1, TreeNode node2)        {            if (node2.Parent == null) return false;            if (node2.Parent.Equals(node1)) return true;            return ContainsNode(node1, node2.Parent);        }

           #region  鼠标拖拽效果三个tv公用方法        /// <summary>        /// 鼠标拖拽效果三个tv        /// </summary>        /// <param name="myNode">鼠标选中的节点</param>        /// <param name="DropNode">要移动到那个节点下面或者上面的落下节点</param>        ///  <param name="VehicleStateType_ID">车辆状态类型</param>        private void DragNodeView(TreeNode myNode, TreeNode DropNode, int VehicleStateType_ID)        {            //1找到选中节点的排序            string sqlmyNode = "SELECT VehicleOrder_ID from EMTinCar where NO='" + myNode.Text + "'";            string myNodeValue = Common.Conn.SqlHelper.getSqlValue(sqlmyNode);                int NodeValue=0;                if (!string.IsNullOrEmpty(myNodeValue))            {                NodeValue = Convert.ToInt32(myNodeValue);            }            //2找到落下的节点的排序            string sqlDragNode = "SELECT VehicleOrder_ID from EMTinCar where NO='" + DropNode.Text + "'";                      string DragNodeValue = Common.Conn.SqlHelper.getSqlValue(sqlDragNode);            int DragNodes = 0;            if (!string.IsNullOrEmpty(DragNodeValue))            {                 DragNodes = Convert.ToInt32(DragNodeValue);            }            string JuageSql = string.Empty;            string strupdateSql = string.Empty;            string strMessage = string.Empty;            if (NodeValue > DragNodes)            {                #region 上移                //3 小于选中的,大于等于落下的排序加1                JuageSql = string.Format("exec Up_EMTinCarinfo {0},{1},{2}", VehicleStateType_ID, NodeValue, DragNodes);                strMessage = Common.Conn.SqlHelper.ExecSql(JuageSql);                if (strMessage != string.Empty)                {                    return;                }                #endregion            }            else            {                #region  下移                //3把落下的节点的排序,替换之前把之前的排序                JuageSql = string.Format("exec Up_EMTinCarinfo1 {0},{1},{2}", VehicleStateType_ID, myNodeValue, DragNodeValue);                strMessage = Common.Conn.SqlHelper.ExecSql(JuageSql);                if (strMessage != string.Empty)                {                    return;                }                #endregion            }            //4选中节点的排序与落下的节点的排序互换            DataTable dt = YieldTransitEditBus.getTinByNo(myNode.Text);            if (dt != null && dt.Rows.Count > 0)            {                tin.ID = Convert.ToInt32(dt.Rows[0]["ID"].ToString());            }            tin.VehicleOrder_ID = Convert.ToInt32(DragNodeValue);            tin.VehicleStateType_ID = VehicleStateType_ID;            YieldTransitEditBus.updateemtin(tin);               }        #endregion

拖拽操作数据库对应表的字段排序重新

分上移:选中的节点移动到那个节点的范围内小于选中的,大于等于落下的排序加1

--替换之前把之前的排序+1    CREATE PROC Up_EMTinCarinfo     @VehicleStateType_ID int, --车辆状态     @VehicleOrder_ID1 int,--选中节点的排序     @VehicleOrder_ID2 int --落下的节点的排序    AS     declare  up_EMTinCarinfo_cursor  cursor scroll for         --结果集    SELECT ID,VehicleOrder_ID FROM EMTinCar where VehicleStateType_ID =@VehicleStateType_ID    and VehicleOrder_ID >=@VehicleOrder_ID2  AND  VehicleOrder_ID<@VehicleOrder_ID1        open up_EMTinCarinfo_cursor      declare @ID int ,@VehicleOrder_ID int      fetch First from up_EMTinCarinfo_cursor into @ID ,@VehicleOrder_ID          WHILE @@fetch_status=0       begin       Update EMTinCar Set VehicleOrder_ID=@VehicleOrder_ID+1 Where ID=@ID       --set @VehicleOrder_ID=@VehicleOrder_ID+1    fetch next from up_EMTinCarinfo_cursor into @ID ,@VehicleOrder_ID            end      CLOSE up_EMTinCarinfo_cursor      DEALLOCATE up_EMTinCarinfo_cursor    


下移:

--替换之前把之前的排序-1    CREATE PROC Up_EMTinCarinfo1     @VehicleStateType_ID int, --车辆状态     @VehicleOrder_ID1 int,--选中节点的排序     @VehicleOrder_ID2 int --落下的节点的排序    AS     declare  up_EMTinCarinfo_cursor1  cursor scroll for     ----结果集    SELECT ID,VehicleOrder_ID FROM EMTinCar where VehicleStateType_ID =@VehicleStateType_ID    and VehicleOrder_ID >@VehicleOrder_ID1  AND  VehicleOrder_ID<=@VehicleOrder_ID2         -- --要循环的结果集  --SELECT ID ,VehicleStateType_ID from(  --SELECT ID ,VehicleStateType_ID,isnull(a.ReturnTime,getdate()) ReturnTime  from EMTinCar   --LEFT JOIN (  --SELECT max(yt.ID) AS YtID,et.NO,max(ReturnTime) ReturnTime,yt.EMTinCar_ID from YieldTransit yt  --INNER JOIN EMTinCar et on yt.EMTinCar_ID =et .ID   --left JOIN YieldTransitReturn on yt.ID=YieldTransitReturn.YieldTransit_ID  --group BY et.NO ,yt.EMTinCar_ID  --) a ON EMTinCar_ID=EMTinCar.ID  --where VehicleStateType_ID=@VehicleStateType_ID) aa order by ReturnTime ASC              open up_EMTinCarinfo_cursor1    declare @ID int ,@VehicleOrder_ID int        fetch First from up_EMTinCarinfo_cursor1 into @ID ,@VehicleOrder_ID        WHILE @@fetch_status=0     begin     Update EMTinCar Set VehicleOrder_ID=@VehicleOrder_ID-1 Where ID=@ID         fetch next from up_EMTinCarinfo_cursor1 into @ID ,@VehicleOrder_ID          end    CLOSE up_EMTinCarinfo_cursor1    DEALLOCATE up_EMTinCarinfo_cursor1 

            //4选中节点的排序与落下的节点的排序互换            DataTable dt = YieldTransitEditBus.getTinByNo(myNode.Text);            if (dt != null && dt.Rows.Count > 0)            {                tin.ID = Convert.ToInt32(dt.Rows[0]["ID"].ToString());            }            tin.VehicleOrder_ID = Convert.ToInt32(DragNodeValue);            tin.VehicleStateType_ID = VehicleStateType_ID;            YieldTransitEditBus.updateemtin(tin);       

        //修改        public static bool UPDATEEMTinCarVehicleStateType(EMTinCarModel et)        {            try            {                StringBuilder sb = new StringBuilder();                sb.Append("exec UPDATE_EMTinCar_VehicleStateType @VehicleStateType_ID ,@VehicleOrder_ID,@ID");                SqlParameter[] spr = new SqlParameter[]                {                      new  SqlParameter ("@VehicleStateType_ID",SqlDbType.Int),                      new  SqlParameter ("@VehicleOrder_ID",SqlDbType.Int),                      new  SqlParameter ("@ID",SqlDbType.Int)                };                spr[0].Value = et.VehicleStateType_ID;                spr[1].Value = et.VehicleOrder_ID;                spr[2].Value = et.ID;                foreach (SqlParameter  item in spr)                {                    if (item .Value ==null)                    {                        item.Value = DBNull.Value;                    }                }                int k = Common.Conn.SqlHelper.ExecuteNonQuery(sb.ToString(), spr);                if (k > 0)                {                    return true;                }                else {                    return false;                }            }            catch (Exception ex)            {                return  false;                throw ex;            }        }
CREATE proc UPDATE_EMTinCar_VehicleStateType          @VehicleStateType_ID int,      @VehicleOrder_ID int ,         @ID int        as        UPDATE EMTinCar  set VehicleStateType_ID=@VehicleStateType_ID,VehicleOrder_ID=@VehicleOrder_ID  where ID=@ID




0 0
原创粉丝点击