Avatar billede grandphoenix Nybegynder
07. marts 2008 - 23:45 Der er 6 kommentarer og
2 løsninger

problem med TreeView og dens SelectedNode efter en opdatering

Hej.
Jeg har et TreeView der driller mig.

Jeg har det hersens Treeview jeg har en masse ting i.
jeg har så et stykke kode der tilføjer en ny treenode.
Når det er sket får jeg den til at opdatere træet ved at
TreeView.Nodes.Clear();
men så vil jeg gerne have den til at genvælge den node der var valgt inden jeg lavede den clear()

jeg har prøvet med
TreeNode tempNode = TreeView.SelectedNode;
lige før jeg laver den der Clear(), og så efter jeg har fyldt TreeView'et igen bruger jeg en
TreeView.SelectedNode = tempNode;

men der sker intet. den vælger slet ikke noget eller også bliver den første node i hele TreeViewet valgt.
Avatar billede nielle Nybegynder
08. marts 2008 - 09:28 #1
Nej, for den gamle node holder helt op med at eksistere når du kalder clear. Den findes derform ikke i den nye version af dit treeview. Du må finde en anden måde at genkende noden på. F.eks. ud fra hvad der står i den - hvis det altså er unikt nok.
Avatar billede grandphoenix Nybegynder
08. marts 2008 - 11:47 #2
Det er også hvad jeg tænkte, men hvis jeg pauser med et breakpoint ved 'TreeView.SelectedNode = tempNode;' linien, så kan jeg se at tempNode faktisk indeholder den node jeg er intereseret i. tempnode har dog mistet sin FullPath.
Er der ikke en anden måde at vælge en node i treeviewet end ved at bruge SelectNode ?
Avatar billede nielle Nybegynder
08. marts 2008 - 12:42 #3
Ja, tempNode holder stadig fast en reference til noden ... men den eksistere ikke mere i dit TreeView efter Clear(). Her er der til gengæld en node som måske nok "ligner" men som *ikke* er den samme.
Avatar billede grandphoenix Nybegynder
08. marts 2008 - 13:53 #4
ARGH det her er belastende.

Jeg har prøvet at lave en
TreeNode testNode = (TreeNode)TreeView.SelectedNode.Clone();
men den testNode indeholder åbenbart ikke nok til at kunne bruges når TreeView.SelectedNode skal sættes igen.

Jeg har sågar prøvet at:
(det gamle treeview kalder jeg her bare for TreeviewA)

TreeView TreeViewB = new TreeView();
foreach(TreeNode tempNode in TreeViewA.Nodes)
    TreeViewB.Nodes.Add((TreeNode)tempNode.Clone());
TreeViewB.SelectedNode = TreeViewA.SelectedNode;

(har også prøvet at bruge
TreeViewB.SelectedNode = (TreeNode)TreeViewA.SelectedNode.Clone();
istedet for ovenstående linie)

Altså lave et helt nyt TreeView og clone alle nodes'ne over i det nye treeview fra det gamle, og så sætte det TreeviewB.SelectedNode til treeViewA.selectedNode. og det virker heller ikke. TreeViewB.SelectedNode forbliver Null.

Det lader til at et Treeview's SelectedNode Kun kan benyttes hvis man sætter den til at være lig med en Treenode den fra den SELV. Ikke fra nogle andre steder, ikke engang fra et andet TreeView der indeholder precis de samme Nodes.

Hvorfor skal det være så svært at vælge en node via kode...
Avatar billede nielle Nybegynder
08. marts 2008 - 13:59 #5
Nej, for en clone er jo en helt ny node.

Bare for di at to noder ligner hinanden så er de ikke ens - de skal også ligge på samme sted i hukommelsen.
Avatar billede grandphoenix Nybegynder
09. marts 2008 - 08:28 #6
hmm fiksede det selv.
jeg lavede bare min egen søge funktion ved at gøre sådan her:

findNode(string fullPath,string nodeName)
{
    foreach(TreeNode treeNode in treeViewA.Nodes)
    {
        if (treeNode.Text == nodeName && treeNode.FullPath == fullPath)
                {
                    treeViewA.SelectedNode = treeNode;
                    break;
                }
                else
                {
                    findNodeSub(treeNode, fullPath, nodeName);
                }
    } 
}

findNodeSub(TreeNode sourceNode, string fullPath, string nodeName)
{
    foreach (TreeNode treeNode in sourceNode.Nodes)
    {
                if (treeNode.Text == nodeName && treeNode.FullPath == fullPath)
                {
                    treeViewA.SelectedNode = treeNode;
                    break;
                }
                else
                {
                    findNodeSub(treeNode, fullPath, nodeName);
                }
    }
}

så gemte jeg bare den valgte Treenode's fullpath og text inden jeg kørte den clear() og kaldte min søgefunktion bagefter.

Du fik ikke helt løst problemet nielle, men du bragte mig i den rigtige retning.
Smid et svar og du får halvdelen af point'sne (hvis man stadig kan det)
Avatar billede nielle Nybegynder
09. marts 2008 - 08:35 #7
Det var også noget i den stil jeg argumenterede for at du måtte gøre i 08/03-2008 09:28:11 :^)

Fint med halvdelen af pointene. :^)
Avatar billede nielle Nybegynder
09. marts 2008 - 11:19 #8
Tak for point :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester