Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

How can I maintain the scroll position of a treeview control in .NET application? For example, I have a treeview control and go through a process of adding various nodes to it tacking them on to the bottom. During this process, I can scroll through the treeview and view different nodes. The problem is when the process completes, the treeview scrolls to the very bottom.

It appears that calling treenode.Expand() is what is throwing me off track here. When a parent node is expanded, it gets the focus.

Is there a way around this? If I'm looking at a specific node while the process is running, I don't want it to jump around on me when the process is done.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
369 views
Welcome To Ask or Share your Answers For Others

1 Answer

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();

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...