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);
"Je change de nœud", qu'est-ce que cela signifie? –
J'ai un morceau de code qui change un noeud. Voir ma modification sur le poteau de départ – Martijn