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
- Winfrom treeview拖拽功能
- winfrom中treeview与richtextbox之间的拖拽问题
- c#Treeview拖拽功能
- winfrom treeview的绑定
- 使用WinFrom控件-TreeView
- WinFrom中TreeView中的应用
- c# winform TreeView控件中实现拖拽的功能
- c# winform TreeView控件中实现拖拽的功能
- c# winform TreeView控件中实现拖拽的功能
- c# winform TreeView控件中实现拖拽的功能
- 需要在TreeView空间中实现拖拽的功能
- [C#.WF] WinFrom TreeView Selecte all
- winfrom 绑定TreeView的实现(三层)
- Winfrom开发之通过treeview实现树形结构
- c# winform TreeView控件中实现拖拽的功能 (一)
- 【转】c# winform TreeView控件中实现拖拽的功能
- winfrom的textbox 实现验证功能
- VS2010 dev控件 拖拽不到Winfrom上的原因
- J版OpenStack table、tab前后翻页
- C++中string类解析
- 51nod 1429:巧克力
- 5个好用的开源数据挖掘软件
- cmd命令的学习总结(1)
- Winfrom treeview拖拽功能
- 【iOS】OC与JS交互 网页中调用JS与JS注入
- Web前端切图快捷键、技巧和经验
- CentOS部署TeamTalk服务器
- Linux 查看系统硬件信息(实例详解)
- Android中SharedPreferences使用方法介绍
- #include<string> 与#include<string.h>
- phantomjs设置截图大小
- android.support.v4.view.ViewPager 如何动态更换显示内容