Avatar billede segato Nybegynder
22. februar 2004 - 13:16 Der er 9 kommentarer og
1 løsning

Node index TreeView

Har gransket nettet nu uden held. Hvordan finder man indexet af en selected TreeNode i et treeview kontrol. Det er nemt nok at finde dybden af en node:

while( node.Parent != null )
{
    node = node.Parent;
        level++;
}

Men hvordan finder jeg index hvis ens treeview også har subnodes?
Get selcted returnere jo kun rootnodes.
Avatar billede sekhmet_ds Nybegynder
22. februar 2004 - 13:24 #1
Nu har jeg ikke lige testet hvad den giver men kan TreeNode.Index ikke bruges, og i så fald hvorfor ikke?
Avatar billede segato Nybegynder
22. februar 2004 - 13:41 #2
Index giver dig index'et på din root node. Det vil sige den første node i din træ struktur. Ville ellers havde været dejligt.
Avatar billede segato Nybegynder
22. februar 2004 - 13:42 #3
http://www.pcplus.co.uk/media/pcplus/pdf/207/207.programmers%20world.c%20sharp.pdf

Her kan problemstillingen ses. Der mangler bare lige den sidste beskrivelse i denne information.
Avatar billede sekhmet_ds Nybegynder
22. februar 2004 - 13:47 #4
Kan du ikke finde index for den node du står med i dens Parents node collection, og så beregne dig frem til det rekursivt?

I følge dokumentationen for TreeNode skulle TreeNode.Index give dig en nodes index i dens parent, så medmindre der er en fejl i implementationen så...
Avatar billede segato Nybegynder
22. februar 2004 - 13:55 #5
Jo men hvordan? Nu stiller du mit spørgsmål til mig selv:D
Avatar billede sekhmet_ds Nybegynder
22. februar 2004 - 15:28 #6
TreeNode.Parent.Nodes.IndexOf burde give dig index'et for en node i dens parent. Hvis du så rekursivt løber op igennem træet, og ligger de indices du får sammen, til du kommer til din rod knude og så ligger rodens Index til, så burde du umiddelbart få noget der virker.

Noget i stil med:

TreeNode = startNode;
TreeNode parent = startNode.Parent;
TreeNode child = startNode;
int index = 0;
while (parent != null) {
  index += parent.Nodes.IndexOf(child);
  parent = parent.Parent;
  child = parent;
}
index += child.Index;
Avatar billede segato Nybegynder
22. februar 2004 - 15:36 #7
Det er desværre en smule hen i skoven, men takker for din indsats. Man skal sidde og lege lidt med det i koden så vil du se at det er en lidt åndsvag måde de har lavet det her på. Jeg ved pc plus har et program i deres magasin der viser lige præcis hvordan det skal gøres. Kan bare ik få fat på det:D
Avatar billede sekhmet_ds Nybegynder
22. februar 2004 - 15:53 #8
Har flere gange selv undret mig over implmentationen af TreeView så det kommer ikke som en overraskelse.

Har lige lavet en test og kan godt se jeg var lidt ude i skoven :) Her kommer en revideret udgave der virker men er sikkert ikke specielt optimal:

int CalcIndex(TreeNode startNode) {
    TreeNode parent = startNode.Parent;
    TreeNode child = startNode;
    int index = 0;
    while (parent != null) {
        index += parent.Nodes.IndexOf(child) + 1;
        child = parent;
        parent = parent.Parent;
    }
    index += child.Index;
    TreeNode prev = child.PrevNode;
    while (prev != null) {
        index += CountChildren(prev);
        prev = prev.PrevNode;
    }

    return index;
}

int CountChildren(TreeNode node) {
    int count = 0;
    foreach (TreeNode child in node.Nodes)
        count += CountChildren(child) + 1;
    return count;
}
Avatar billede segato Nybegynder
22. februar 2004 - 16:23 #9
hej sekhmet!

Jeg vil lige kigge på det. Kan du ikke oprette et svar så du kan få point for din indsats. Takker mange gange for din hjælp.
Avatar billede sekhmet_ds Nybegynder
22. februar 2004 - 16:24 #10
Det var så lidt
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