2010-07-29 7 views
0

J'ai une vue arborescente avec beaucoup de nœuds. Si je change de nœud, la barre de défilement de l'arborescence est définie en bas. Pour garder le nœud commuté visible, utiliser node.EnsureVisible(). Mais je n'aime pas beaucoup cette méthode, car elle déroute l'utilisateur final.Treeview maintenir la position de défilement

Alors je regarde plus loin et maintenant j'utiliser le code qui est fourni ici:

Maintain scroll position of treeview

Le problème de ce code est, le contenu du treeview ne défile pas. La barre de défilement est à la bonne position, mais le contenu ne fait rien. Jusqu'à ce que je clique sur la barre de défilement (je ne défile pas) le contenu devient visible. Donc, ce que je veux réaliser, c'est quand un commutateur est activé, je veux maintenir la position de défilement.

Code qui commute un noeud. Dans ce cas, un noeud vers le bas. Le regard de la fonction comme ceci:

// Check a node is selected 
if (tvCategories.SelectedNode == null) 
    return; 

// The first node may not be moved 
if (IsNewRootCategorySelected()) 
    return; 

Point ScrollPos = GetTreeViewScrollPos(tvCategories); 

// Declare and instantiate the parent node 
TreeNodeCollection parent = null; 
if (tvCategories.SelectedNode.Parent == null) 
    parent = tvCategories.Nodes; 
else 
    parent = tvCategories.SelectedNode.Parent.Nodes; 

TreeNode selectedNode = tvCategories.SelectedNode; 
int index = selectedNode.Index; 

// Check there's a next node at the same level 
if (tvCategories.SelectedNode.NextNode == null) 
{ 
    // Check if the parent node has a next node 
    if (tvCategories.SelectedNode.Parent != null && tvCategories.SelectedNode.Parent.NextNode != null) 
    { 
     // get the destination parent 
     TreeNode destParent = selectedNode.Parent.NextNode; 

     // remove selected node from tree view 
     parent[index].Remove(); 

     // If selected node is a category, add the node to the first index 
     if (selectedNode.Tag is Category) 
     { 
      destParent.Nodes.Insert(0, selectedNode); 
     } 

     // If selected node is a question, add node below last category 
     if (selectedNode.Tag is Question) 
     { 
      int newIndex = 0; 

      // Loop through collection to find last category 
      for (int i = destParent.Nodes.Count - 1; i >= 0; i--) 
      { 
       if (destParent.Nodes[i].Tag is Category) 
       { 
        newIndex = i + 1; 
        break; 
       } 
      } 

      destParent.Nodes.Insert(newIndex, selectedNode); 
     } 

     selectedNode.Expand(); 
    } 
} 
else 
{ 
    // Switch nodes in same level 

    tvCategories.BeginUpdate(); 
    _loading = true; 

    if (selectedNode.Tag is Category) 
    { 
     // Only switch category downwards when next node is a catgory 
     if (selectedNode.NextNode.Tag is Category) 
     { 
      // Perform switch 
      TreeNode switchNode = parent[index + 1]; 

      parent[index + 1].Remove(); 
      parent[index].Remove(); 

      parent.Insert(index, switchNode); 
      parent.Insert(index + 1, selectedNode); 
     } 
     else if (selectedNode.NextNode.Tag is Question) 
     { 
      // Make the switch to another node below 
      if (selectedNode.Parent.NextNode != null) 
      { 
       // Parent is always a category 

       TreeNode categoryParent = selectedNode.Parent.NextNode; 

       // Remove selected node from current parent 
       parent.Remove(selectedNode); 

       // Insert selected node 
       categoryParent.Nodes.Insert(0, selectedNode); 

      } 
     } 
    } 
    if (selectedNode.Tag is Question) 
    { 
     if (selectedNode.NextNode.Tag is Question) 
     { 
      // Perform switch 
      TreeNode switchNode = parent[index + 1]; 

      parent[index + 1].Remove(); 
      parent[index].Remove(); 

      parent.Insert(index, switchNode); 
      parent.Insert(index + 1, selectedNode); 
     } 
    } 
} 

tvCategories.EndUpdate(); 
// Set focus 
tvCategories.Focus(); 

tvCategories.SelectedNode = selectedNode; 
SetTreeViewScrollPos(tvCategories, ScrollPos); 
+0

"Je change de nœud", qu'est-ce que cela signifie? –

+0

J'ai un morceau de code qui change un noeud. Voir ma modification sur le poteau de départ – Martijn

Répondre

0
using System.Runtime.InteropServices; 

     [DllImport("user32.dll")] 
     static public extern int SendMessage(
       IntPtr hWnd, // HWND handle to destination window 
       int Msg,  // UINT message 
       int wParam, // WPARAM first message parameter 
       int lParam // LPARAM second message parameter 
       ); 

     public const int SB_LINEUP = 0; 
     public const int SB_LINELEFT = 0; 
     public const int SB_LINEDOWN = 1; 
     public const int SB_LINERIGHT = 1; 
     public const int SB_PAGEUP = 2; 
     public const int SB_PAGELEFT = 2; 
     public const int SB_PAGEDOWN = 3; 
     public const int SB_PAGERIGHT = 3; 
     public const int SB_THUMBPOSITION = 4; 
     public const int SB_THUMBTRACK = 5; 
     public const int SB_TOP = 6; 
     public const int SB_LEFT = 6; 
     public const int SB_BOTTOM = 7; 
     public const int SB_RIGHT = 7; 
     public const int SB_ENDSCROLL = 8; 

     public const int WM_HSCROLL = 276; 
     public const int WM_VSCROLL = 277; 

     public void eZScroll(TreeView treeView, ArrowDirection direction, int numScrolls) 
     { 
      int Msg = 0; 
      int wParam = 0; 
      int lParam = 0; 

      switch (direction) 
      { 
       case ArrowDirection.Up: 
        Msg = WM_VSCROLL; 
        wParam = SB_LINEUP; 
        break; 
       case ArrowDirection.Down: 
        Msg = WM_VSCROLL; 
        wParam = SB_LINEDOWN; 
        break; 
       case ArrowDirection.Left: 
        Msg = WM_HSCROLL; 
        wParam = SB_LINELEFT; 
        break; 
       case ArrowDirection.Right: 
        Msg = WM_HSCROLL; 
        wParam = SB_LINERIGHT; 
        break; 
      } 

      for (int i = 0; i < numScrolls; i++) 
      { 
       SendMessage(treeView.Handle, Msg, wParam, lParam); 
      } 
     } 

Coller quelque part après:

public Form1() 
{ 
    InitializeComponent(); 
} 

Appel comme ceci:

eZScroll(treeView1, ArrowDirection.Up, 1); 

Je ne suis pas sûr que ce code ne fonctionnera dès sa sortie de la boîte mais je suis sûr que cela vous aidera à résoudre votre problème.