utilizar net ejemplos dinamico como bootstrap .net winforms treeview

.net - net - treeview checkbox c#



Mantener la posiciĆ³n de desplazamiento de treeview (8)

¿Cómo puedo mantener la posición de desplazamiento de un control treeview en la aplicación .NET? Por ejemplo, tengo un control de vista en árbol y paso por un proceso de agregar varios nodos a él pegándolos en la parte inferior. Durante este proceso, puedo desplazarme por la vista en árbol y ver diferentes nodos. El problema es cuando el proceso se completa, la vista en árbol se desplaza hacia abajo.

Parece que llamar a treenode.Expand () es lo que me hace perder el rumbo aquí. Cuando un nodo padre se expande, obtiene el foco.

¿Hay alguna forma de evitar esto? Si estoy mirando un nodo específico mientras el proceso se está ejecutando, no quiero que me salte cuando termine el proceso.


Creo que lo descubrí:

  1. Obtener el nodo en la parte superior de la vista de árbol.
  2. Expande el nodo padre.
  3. Haga visible el nodo que estaba anteriormente en la parte superior.

If treeNodeParent.IsExpanded = False Then Dim currentNode As TreeNode = TreeViewHosts.GetNodeAt(0, 0) treeNodeParent.Expand() currentNode.EnsureVisible() End If

¿Es la mejor manera de hacer esto?


myTreeView.Nodes[0].EnsureVisible();


Es una revisión de la hermosa respuesta de Stefan Koell, como TreeViewExtension: (solución completa)

using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Controls; using System.Windows.Interop; using System.Windows.Media; public static class TreeViewExtension { #region Constants private const int ScrollBarHorizontal = 0x0; private const int ScrollBarVertical = 0x1; #endregion #region Public Methods and Operators [DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] public static extern int GetScrollPos(int hWnd, int nBar); public static Point ScrollPosition(this TreeView treeView) { return new Point( GetScrollPos((int)treeView.Handle(), ScrollBarHorizontal), GetScrollPos((int)treeView.Handle(), ScrollBarVertical)); } public static void ScrollTo(this TreeView treeView, Point scrollPosition) { SetScrollPos(treeView.Handle(), ScrollBarHorizontal, (int)scrollPosition.X, true); SetScrollPos(treeView.Handle(), ScrollBarVertical, (int)scrollPosition.Y, true); } [DllImport("user32.dll")] public static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw); #endregion #region Methods private static IntPtr Handle(this Visual treeView) { var handle = IntPtr.Zero; var hwndSource = PresentationSource.FromVisual(treeView) as HwndSource; if (hwndSource != null) { handle = hwndSource.Handle; } return handle; } #endregion }

Quizás simplifique tu trabajo ;-)


Descubrí que es mejor ajustar SetTreeViewScrollPosition(point) con BeginUpdate y EndUpdate ...

private void treeViewXml1_Scroll(object sender, ScrollEventArgs e) { Point point = treeViewXml1.GetTreeViewScrollPosition(); treeViewXml2.BeginUpdate(); treeViewXml2.SetTreeViewScrollPosition(point); treeViewXml2.EndUpdate(); } private void treeViewXml2_Scroll(object sender, ScrollEventArgs e) { Point point = treeViewXml2.GetTreeViewScrollPosition(); treeViewXml1.BeginUpdate(); treeViewXml1.SetTreeViewScrollPosition(point); treeViewXml1.EndUpdate(); }


También tuve el mismo problema donde el rollo se actualizó, pero el contenido de la vista en árbol no se desplazó. Esto se solucionó fácilmente al agregar BeginUpdate() y EndUpdate() alrededor de SetScrollPos() .

this.hierarchyTreeView.BeginUpdate(); SetScrollPos(this.hierarchyTreeView.Handle, SB_VERT, 5, true); this.hierarchyTreeView.EndUpdate();


Otra forma de conservar la posición de desplazamiento sin funciones externas es usar la propiedad TopNode del árbol ...

TopNode obtiene o establece el primer nodo de árbol completamente visible en el control de vista en árbol.

Si solo desea expandir un nodo y hacer que preserve el nodo superior:

TreeNode topNode = m_Tree.TopNode; treenode.Expand(); m_Tree.TopNode = topNode;

De lo contrario, si está reconstruyendo un árbol (como actualizar una estructura de archivos), puede usar el siguiente método ...

Antes de borrar el árbol, almacene la ruta completa al nodo superior:

string topNodePath = null; TreeNode topNode = null; if (m_Tree.TopNode != null) { topNodePath = m_Tree.TopNode.FullPath; } m_Tree.Clear();

Después de agregar un nodo, compruebe su FullPath contra el topNodePath:

nodes.Add(node) if ((topNodePath != null) && (node.FullPath == topNodePath)) { topNode = node; }

Después de agregar todos los nodos, actualice la propiedad TopNode del árbol:

if (topNode != null) { m_Tree.TopNode = topNode; }

Utilizo una técnica similar para nodos seleccionados y expandidos. SelectedNode funciona casi exactamente como TopNode mostrado arriba. Para los nodos expandidos utilizo una función recursiva para recorrer los nodos secundarios y agregar la ruta de los nodos expandidos a una lista. Luego los expande en función de su ruta después de que se hayan agregado los hijos.

Por supuesto, si tienes muchos nodos hermanos con el mismo nombre, esto podría no funcionar tan bien :-)


Lo mejor es usar UpdatePanel y anidar las etiquetas treeview dentro de él. Por ejemplo,

<asp:UpdatePanel id="UpdatePanel"> <ContentTemplate> <asp:TreeView id="TreeView"> </asp:TreeView> </ContentTemplate> </asp:UpdatePanel>

Me funcionó, y espero que resuelva tu problema.


No soy un tipo VB, pero en C # lo hago de esta manera:

Algunas funciones nativas de Win32:

[DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int GetScrollPos(IntPtr hWnd, int nBar); [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw); private const int SB_HORZ = 0x0; private const int SB_VERT = 0x1;

Un método que devuelve un punto para la posición de desplazamiento actual:

private Point GetTreeViewScrollPos(TreeView treeView) { return new Point( GetScrollPos((int)treeView.Handle, SB_HORZ), GetScrollPos((int)treeView.Handle, SB_VERT)); }

Un método para establecer la posición de desplazamiento:

private void SetTreeViewScrollPos(TreeView treeView, Point scrollPosition) { SetScrollPos((IntPtr)treeView.Handle, SB_HORZ, scrollPosition.X, true); SetScrollPos((IntPtr)treeView.Handle, SB_VERT, scrollPosition.Y, true); }

Luego, cuando actualice su árbol, haga lo siguiente:

Point ScrollPos = GetTreeViewScrollPos(treeMain); // write your update code here SetTreeViewScrollPos(treeMain, ScrollPos);