设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2360|回复: 6
打印 上一主题 下一主题

[ActiveX] 有关于TreeView拖拽的逻辑有点混乱,需要高人指点。

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2015-1-28 22:10:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有关于TreeView拖拽移动节点的代码中:

'     开始拖动时,设定选择为空,已备选择数据

  Private Sub objTreeview_OLEStartDrag(Data As Object, AllowEffects As Long)
          Me!objTreeview.Object.SelectedItem = Nothing    这里设置了选中为空
     End Sub



-------------------------------------------------------------------------------------------


'     拖动鼠标事件,选择拖放节点,并高亮度显示放开Mouse时接受数据的节点,本程序设置已选节点为已拖动过,这样,程序将不再重置它,后半部分程序高亮显示结果
     Private Sub objTreeView_OLEDragOver (Data As Object,Effect As Long, Button As Integer, Shift As Integer,  x As Single, y As Single, State As Integer)
     Dim oTree As TreeView
     set oTree = Me!objTreeView.Object
     '如无节点被选中,则选择你曾经拖过的第一个
     If oTree SelectedItem Is Nothing Then
          Set oTree SelectedItem = oTree.HitTest(X,Y)
     End If
     ' 高亮显示
     Set oTree.DropHighlight = oTree.HitTest(x, y)



----------------------------------------------------------------------------------------------
'移动节点在TreeView空间中 的位置,并更改数据表记录。程序先检查是否存在一个已选节点,并继续检查是否高亮显示放下对象,如果未高亮显示,表示用户将其放入了空白区域,则将其赋值为根节点
     Private Sub objTreeView_OLEDragDrop( Data as object,Effect As Long, Button As Integer,Shift As Integer, x as single, y as single)
     on error goto Err_ObjTreeView_OLEDragdrop
     Dim oTree as TreeView, strKey As String, StrText As String
     Dim nodNow As Node, nodDragged As Node
     Dim db as Database, rs as Recordset


     set db = CurrentDb
     '打开表进行编辑
     Set rs = db.OpenRecordset("tblBOM",adOpenDynaset)
     Set oTree = Me!objTreeView.Object
     '如误解点被选中,则下课休息
     If oTree SelectedItem is Nothing Then
     Else      '相反
          Set nodDragged = oTree.SelectedItem             但是这里又有SelectedItem了。之前不是已经设置为空了吗?为什么还能有?
          '如果节点被拖放到空白区,则修改数据表并将其设为根节点
          If oTree.DropHighLight Is Nothing Then
               '保存Text值及显示文本以备重新装入时使用
               strKey = nodDragged.Key
               strText = nodDragged.Text
               ' 删除当前对象的节点
               oTree.Nodes.Remove NodDragged.Index
               '在数据表中查找记录并修改之
               rs.FindFirst "FBOMID=" & Mid(strKey,2)
               rs.Edit
                    rs!FMainID = Me.FMaterial
               rs.Update
               '将其装入为根节点              
               Set nodNew = oTree.Nodes.Add( , , strKey,StrText,1,2)
               '装入其所有子节点
               AddChild nodNew,rs
          ElseIf nodDragged.Index<> oTree.DropHighLight.Index Then
               Set nodeDragged.Parent = oTree.DropHighLight         
               rs.findFirst "[ID]=" & mid(nodDragged.Key,2)
               rs.Edit
                    rs!MainID = Mid(oTree.DropHighlight.Key, 2)
               rs.Update
          End If
     End IF
     '取消选择
     Set NodDragged = Nothing
     '取消高亮
     Set oTree.DropHIghLight = Nothing
Exit_objTreeVeiw_OLEDrapDrop:
     Exit Sub
Err_objTreeView_OLEDrapDrop:
     
     If Err.Number = 35614 Then
          MsgBox "母件不得直接成为子件的子件!“
     
     Else
          MsgBox "节点移动错误!"
     End If
     Resume Exit_objTreeVeiw_OLEDrapDrop


=======================================================


OLEStartDrag事件中明明已经设置SeletedItem为Nothing了,为什么OLEDragDrop 事件中还能取得SelecteItem的变量?


我看着的一脸茫然。请大神帮个忙指点下迷津。

在此先谢过了。




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2015-1-29 10:40:08 | 只看该作者
无表无图无文件,很难看下去

点击这里给我发消息

3#
发表于 2015-2-4 23:14:05 | 只看该作者
在 objTreeview_OLEStartDrag 事件中是设置为空了,但在objTreeView_OLEDragOver事件中又设置为 oTree.HitTest(X,Y) 了
注意事件的顺序:objTreeview_OLEStartDrag->objTreeView_OLEDragOver->objTreeView_OLEDragDrop

点击这里给我发消息

4#
 楼主| 发表于 2015-2-7 08:23:20 | 只看该作者
t小宝 发表于 2015-2-4 23:14
在 objTreeview_OLEStartDrag 事件中是设置为空了,但在objTreeView_OLEDragOver事件中又设置为 oTree.HitT ...

这个顺序我理解,我现在搞不清楚的是。

在拖拽中原理应该是将原来选中的SelectedItem 拖拽至DropHighLight的根目录下。

但是拖拽的功能实现必须现在StratDrag事件中将selectedItem设置为Nothing。但拖拽功能是必须需要这样原来选中节点变量对象。

设置为nothing以后 为什么在DragDrop事件中取到SelectedItem对象?

点击这里给我发消息

5#
发表于 2015-2-7 09:58:12 | 只看该作者
那些代码处理是要确保拖动的节点是鼠标按下的节点!
在鼠标按下并开始移动时,发生objTreeview_OLEStartDrag事件,但这时不会改变选择的节点(鼠标释放后才改变),也就是说这个时候SelectedItem可能不是鼠标按下的(我们想要拖动的)节点。要想办法把SelectedItem改为鼠标按下的节点,但在objTreeview_OLEStartDrag事件无法判断按下哪个节点,所以先在这个事件中把SelectedItem设为nothing,紧接着会发生objTreeView_OLEDragOver事件,这个事件有x,y参数,这样就可在objTreeView_OLEDragOver事件获得鼠标按下的节点了:Set oTree.SelectedItem = oTree.HitTest(X,Y)
其他的就不用解释了吧

点击这里给我发消息

6#
 楼主| 发表于 2015-2-7 11:47:32 | 只看该作者
t小宝 发表于 2015-2-7 09:58
那些代码处理是要确保拖动的节点是鼠标按下的节点!
在鼠标按下并开始移动时,发生objTreeview_OLEStartDr ...

了解了。多谢了

点击这里给我发消息

7#
发表于 2015-12-11 11:55:42 | 只看该作者
学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-20 15:20 , Processed in 0.090411 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表