Maintain scroll position of treeview

I’m not a VB guy but in C# I do it this way:

Some Win32 native functions:

[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;

A method which returns a point for the current scroll position:

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

A method to set the scroll position:

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

Then when you update your tree, do the following:

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

Leave a Comment