Avatar billede mach3 Nybegynder
21. december 2004 - 15:29 Der er 15 kommentarer og
1 løsning

Treeview: Hvad har man klikket på?

Hej,

Jeg har et treeview, som har fire levels man kan klikke på.

Når man klikker et sted på treeview køres eventhandleren mySelectChangeFn(Object sender, TreeViewSelectEventArgs e)
{
mylabel.Text = e.NewNode.ToString();
}

Det som der kommer til at stå i label er fx:
0
0.0
0.0.0 
0.0.0.0

Således er man i stand til alt efter hvor mange cifre tallet består af at identificere, hvilket level (1,2,3 eller 4) der er blevet klikket på.

Mit spørgsmål er så:
Hvordan kan jeg lave en if (eller noget andet), som er i stand til at teste dette?

Alle disse tilhører fx level 4:
0.0.0.0
0.0.0.1
0.0.0.2
0.0.0.3
0.0.0.4

Alle disse tilhører level 3:
0.0.0
2.1.4
3.1.5

Håber jeg har udtrykt mig tydeligt nok - og at der er nogen som har et tip eller to :o)
Avatar billede mach3 Nybegynder
21. december 2004 - 15:30 #1
Overskriften burde have heddet:
Treeview: Hvilket level har man klikket på? :o)
Avatar billede ranglen Nybegynder
21. december 2004 - 15:38 #2
Du kan vel tælle antallet af punktumer..

int level = s.Split('.').Length;
Avatar billede mach3 Nybegynder
21. december 2004 - 15:48 #3
ranglen >> tak det var lige det jeg skulle bruge :o)

Drop et svar.
Avatar billede mach3 Nybegynder
21. december 2004 - 15:57 #4
Jeg har også lige et spørgsmål mere:

Hvordan får jeg fat på parent (det første ciffer) uanset hvilket level der er blevet klikket på?

Fx hvis der er blevet klikket på
0.0.0.1 - så skal jeg have fat på 0
1.2.2.2 - så skal jeg have fat på 1
4.0 - så skal jeg have fat på 4

Med venlig hilsen
Avatar billede ranglen Nybegynder
21. december 2004 - 16:02 #5
Det kan du ved at bruge strengens indexer..

parent = s[0];
Avatar billede mach3 Nybegynder
21. december 2004 - 16:16 #6
ranglen >> kanon det virker også :-)

her er lidt output!
der er blevet klikket på:
0.0.0.1 - parent er 48
1.2.2.2 - parent er 49


og det passer jo, fordi
48 er DEC for symbolet 0
48 er DEC for symbolet for 1.

men hvordan kan det være at den "ved",  at den kun skal kigge foran punktumet?
Avatar billede segato Nybegynder
21. december 2004 - 18:00 #7
Sjov løsning du har valgt. hvorfor ik gøre det i noget af følgende stil.

TreeNode node = treeView.SeletedNode;
int i = 0;
while(node != null)
{
node = node.Parent;
i++;
}
return i;
Avatar billede ranglen Nybegynder
21. december 2004 - 18:25 #8
det "ved" den fordi du kigger på strengen som et array af chars. [0] første char, [1] andet char, ...

segato, jeg synes faktisk din løsning i dette tilfælde er mere sjov.
Avatar billede segato Nybegynder
21. december 2004 - 18:31 #9
Har rodet en hel del med treeview og syntes der mangler en masse. Jeg stødte på et par problemmer med at finde en nodes index f.eks. eller at hente en node ud fra et index. Men kan lige smide klassen jeg i isn tid lavede måske du kunn ebruge noget derfra:

    public class CEXmlDocument : XmlDocument
    {
        public CEXmlDocument()
        {
            //
            // TODO: Add constructor logic here
            //               
        }

        public CEXmlDocument clone()
        {   
            CEXmlDocument doc = new CEXmlDocument();

            foreach(XmlNode node in this.ChildNodes )
            {
                doc.AppendChild(doc.ImportNode(node, true));
            }       

            return doc;
        }

        public XmlNode getNextNode(XmlNode currXmlNode)
        {
            string test = currXmlNode.Name;

            XmlNode next_node = null;

            if ( currXmlNode.FirstChild != null )
            {
                next_node = currXmlNode.FirstChild;
            }
            else if ( currXmlNode.NextSibling != null )
            {
                next_node = currXmlNode.NextSibling;
            }
            else if ( currXmlNode.ParentNode != null )
            {
                while(currXmlNode.ParentNode.NextSibling != null & currXmlNode.ParentNode != null)
                {                   
                    currXmlNode = currXmlNode.ParentNode;
                    if( currXmlNode.NextSibling != null )
                        return currXmlNode.NextSibling;
                }
               
                if(currXmlNode.NextSibling != null)
                    next_node = currXmlNode.NextSibling;
                else
                    next_node = null;
            }
            else
            {
                return null;
            }
            return next_node;           
        }           

        public int getIndexFromNode(XmlNode xmlNode)
        {
            int nodecount = 0;
            if (xmlNode !=null)
            {   
                XmlNode currXmlNode = this.FirstChild;
                while(currXmlNode != xmlNode)
                {   
                    if (currXmlNode.FirstChild != null) // child node
                        currXmlNode = currXmlNode.FirstChild;
                    else if (currXmlNode.NextSibling != null) // next sibling
                        currXmlNode = currXmlNode.NextSibling;
                    else                            // next sibling of parent
                    {
                        while(currXmlNode.ParentNode.NextSibling == null)
                        {
                            currXmlNode = currXmlNode.ParentNode;
                        }
                        currXmlNode = currXmlNode.ParentNode.NextSibling;
                    }
                    nodecount++;
                }
                return nodecount;
            }
            else
            {
                return -1;
            }               
        }

        public XmlNode getNodeFromIndex(int index)
        {
            XmlNode node = this.FirstChild;

            for(int i = 0; i < index; i++)
            {
                if(node == null)
                {
                    return node;
                }
                node = getNextNode(node);                   
            }   
            return node;
        }
    }
Avatar billede segato Nybegynder
21. december 2004 - 18:32 #10
Ved godt det et XmlDocument men det nøjagtig det samme for et treeview.
Avatar billede segato Nybegynder
21. december 2004 - 18:33 #11
Her er den i treeview model:D

public class CTreeView : System.Windows.Forms.TreeView
    {
        public CTreeView()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        public TreeNode getNodeFromIndex(int index)
        {
            TreeNode node = this.Nodes[0];

            for(int i = 0; i < index; i++)
            {
                if(node == null)
                {
                    return node;
                }
                node = node.NextVisibleNode;               
            }   
            return node;
        }

        public TreeNode GetNextNode(TreeNode curr_node)
        {
            TreeNode next_node = null;
            if(curr_node.FirstNode != null )
            {
                next_node = curr_node.FirstNode;
            }
            else if( curr_node.NextNode != null )
            {
                next_node = curr_node.NextNode;
            }
            else if( curr_node.Parent != null )
            {
                while(curr_node.Parent.NextNode != null & curr_node.Parent != null)
                {
                    curr_node = curr_node.Parent;                   
                }
                if(curr_node.Parent.NextNode != null)
                    next_node = curr_node.Parent.NextNode;
                else
                    next_node = null;
            }
            else
            {
                return null;
            }
            return next_node;           
        }

        public int getIndexFromNode(TreeNode treeNode)
        {
            int nodecount = 0;
            if (treeNode !=null)
            {
                if(treeNode.TreeView == null)
                    return -1;

                TreeNode currNode = treeNode.TreeView.Nodes[0];
                while(currNode != treeNode)
                {   
                    if (currNode.FirstNode != null) // child node
                        currNode = currNode.FirstNode;
                    else if (currNode.NextNode != null) // next sibling
                        currNode = currNode.NextNode;
                    else                            // next sibling of parent
                    {
                        while(currNode.Parent.NextNode == null)
                        {
                            currNode = currNode.Parent;
                        }
                        currNode = currNode.Parent.NextNode;
                    }
                    nodecount++;
                }
                return nodecount;
            }
            else
            {
                return -1;
            }               
        }
    }
Avatar billede ranglen Nybegynder
21. december 2004 - 18:38 #12
I stedet for at tælle, kunne man også vælge at sætte node.Tag = level, når noden oprettes. Så har man altid level lige ved hånden..
Avatar billede segato Nybegynder
21. december 2004 - 18:41 #13
Tror det er det han gør. Personligt kan jeg bare godt lide genbrugelig kode så hvofor ik specialiere et treeview med en getLevel(), og så en anden dag har han lige den funktionalitet ved hånden? Men det som alt andet smag og behag:D
Avatar billede mach3 Nybegynder
21. december 2004 - 18:41 #14
segato >>
Det er Microsoft.Web.UI.WebControls.TreeView jeg anvender. Det som du anvender er System.Windows.Forms.TreeView.

Der er nogle forskelle hist og her, men grundideen skulle være den samme :o)

Det som ranglen forslog med at tælle virker egentligt fint nok. Men jeg kigger din kode i gennem lidt senere. Og mange tak for det :o)

Med venlig hilsen
Avatar billede segato Nybegynder
21. december 2004 - 18:44 #15
Det helt i orden mester og som du siger så er det faktisk det samme. Der er rigtig mange ting treeview, xmldocument og masser af andre ting der bygger på samme princip.
Avatar billede mach3 Nybegynder
15. juni 2007 - 21:15 #16
Tak for hjælpen. Beklager det sene svar.
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