Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: elmaro en 10 Enero 2011, 18:22 pm



Título: Eliminar Expand/Collapse del TreeView al hacer double click
Publicado por: elmaro en 10 Enero 2011, 18:22 pm
Bueno, quien no tuvo este problema? Querer hacer un doble click en un nodo y realizar una acción pero sin que el nodo se expanda?
Tuve este problema y en internet no hay ninguna solución. Entonces decidí postear la que se me ocurrió, que la verdad funciona muy bien y es muy sencilla.

Suponiendo que el treeview se llama tvTree y que ya tiene nodos agregados:

Código
  1. Public cancelAction As Boolean = True
  2.  
  3. Private Sub tvTree_BeforeExpand(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) Handles tvTree.BeforeExpand
  4.       e.Cancel = cancelAction
  5. End Sub
  6.  
  7. Private Sub tvTree_BeforeCollapse(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) Handles tvTree.BeforeCollapse
  8.        e.Cancel = cancelAction
  9. End Sub
  10.  
  11. Private Sub tvTree_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles tvTree.MouseDown
  12.  
  13. Dim node as Treenode = tvTree.GetNodeAt(e.X, e.Y)
  14.        If node.Bounds.IntersectsWith(New Rectangle(e.X, e.Y, e.X, e.Y)) Then
  15.                cancelAction = True
  16.        Else
  17. cancelAction = False
  18.        End If
  19.  
  20. End Sub

Espero les sirva.

Saludos!

#EDIT

Encontre una mejora para el codigo sitado arriba. Funciona mucho mejor y no tiene resultados indeseados. Todas las modificaciones son en tvTree_MouseDown
Se contempla si los nodos tienen imagenes o no.

Código
  1.        Dim node As TreeNode = TreeView1.GetNodeAt(e.X, e.Y) 'Obtengo el nodo donde hice click
  2.  
  3.        If node Is Nothing Then Exit Sub 'Si no hay nodo, salgo
  4.  
  5.        Dim imgWid As Integer = 16 'Ancho de imagen del nodo / imgWid = 0 si no tiene imagen
  6.        Dim rect As Rectangle = New Rectangle(node.Bounds.X - imgWid, node.Bounds.Y, node.Bounds.Width + imgWid, node.Bounds.Height)
  7.  
  8.        If rect.Contains(e.X, e.Y) Then
  9.            cancelAction = True
  10.        Else
  11.            cancelAction = False
  12.        End If

Otros saludos!