none
TreeView的展开和收拢问题. RRS feed

  • 问题

  •    想实现这样的功能:
         1: 双击一个数节点的时候,如果当前是收拢状态,就展开(包括所有子节点);如果当前是展开状态,就收拢(包括所有节点).
         2:单击节点左侧的+或-号的时候则仅仅展开或者收拢当前节点,子节点的状态保持不变.
         尝试了好多事件(比如_NodeMouseDoublecliek,_AfterCollapse,_AfterExpand)都不能同时满足上面两个需求,同时由于系统本身对_NodeMouseDoublecliek有定义(仅展开或者收缩当前节点),如果用_NodeMouseDoublecliek事件来处理的话总是一展开就马上收拢,不知道怎么搞的,可能是冲突了?用overrides尝试重写,系统报错.... 不知道该怎么搞了.....
        我的_NodeMouseDoublecliek方法如下:
        Private Sub TreeView1_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseDoubleClick
            If e.Node.IsExpanded Then
                e.Node.Collapse(False)
            Else
                e.Node.ExpandAll()
           End If
        End Sub
    用_AfterExpand方法倒是能满足第一条,但是第二条又不行了...
    2009年9月13日 7:53

答案

  • 你好!
         这个是因为类库中已经提供了这个NodeMouseDoubleClick事件的默认实现了!
         你双击节点的时候会先执行这个事件的默认实现,比如节点原来是折折叠的,你双击这个节点,先执行默认的实现,就是把节点展开(当然,默认实现是不展开子节点的),然后才执行你自己的实现,这是节点的状态是展开,所以又折叠了!
         我尝试对换你的逻辑:
        
        Private Sub TreeView1_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseDoubleClick
            If e.Node.IsExpanded Then
                e.Node.ExpandAll()
            Else
                e.Node.Collapse(False)
           End If
        End Sub
    
    
    按照程序的逻辑来说,应该是可以实现你的要求的,但是我测试发现,有时可能会失败,我估计可能是IsExpand属性更新不及时的原因!
    我再想想其他的办法!
    周雪峰
    • 已标记为答案 picat 2009年9月16日 5:57
    2009年9月13日 9:02
    版主

全部回复

  • 你好!
         这个是因为类库中已经提供了这个NodeMouseDoubleClick事件的默认实现了!
         你双击节点的时候会先执行这个事件的默认实现,比如节点原来是折折叠的,你双击这个节点,先执行默认的实现,就是把节点展开(当然,默认实现是不展开子节点的),然后才执行你自己的实现,这是节点的状态是展开,所以又折叠了!
         我尝试对换你的逻辑:
        
        Private Sub TreeView1_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseDoubleClick
            If e.Node.IsExpanded Then
                e.Node.ExpandAll()
            Else
                e.Node.Collapse(False)
           End If
        End Sub
    
    
    按照程序的逻辑来说,应该是可以实现你的要求的,但是我测试发现,有时可能会失败,我估计可能是IsExpand属性更新不及时的原因!
    我再想想其他的办法!
    周雪峰
    • 已标记为答案 picat 2009年9月16日 5:57
    2009年9月13日 9:02
    版主
  •    自己顶一下,周版有想法了吗?
    2009年9月16日 4:52
  • 你好!picat!
         请问你能在你的机器上测试一下我上面写的代码吗?我的朋友说这段代码在他的机器上是正常的,可以实现你要的效果,你测试一下试试!
        
    周雪峰
    2009年9月16日 5:47
    版主
  •     不好意思,没看仔细你上面的回复,我还以为跟我贴的一样的代码呢~~
        我测试了一下,没什么大问题,就是有点不大流畅,毕竟其实经历了两个事件,不过目前能满足需求了,谢谢!
    2009年9月16日 5:57