Avatar billede woogoo Nybegynder
02. oktober 2006 - 12:52 Der er 16 kommentarer

list checked folder i andet treeview!

Hej eksperter

jeg har et system hvor jeg vælger et directory og alle undermapper bliver derefter vist i et TreeView! Jeg vil så have at når jeg sætter hak i checkbox ud for mapper og trykker på en knap så skal directory lsites op i et andet treeview!

hvordan gøres det?

jeg har Treeview 1 (tv1) og TreeView 2 (tv2)..
Avatar billede bulgroz Nybegynder
02. oktober 2006 - 14:36 #1
Du bliver nødt til at iterere alle dine noder. Hvis en node er Checked så skal den klones til en ny node og indsættes i tv2. En træ node kan nemlig kun "leve" i ét træ af gangen.

TreeNode newNode = (TreeNode)node.Clone();

Du bliver ogsånødt til at tage stilling til hvad der skal ske hvis en child af en checked parent eksisterer.
Avatar billede bulgroz Nybegynder
02. oktober 2006 - 14:47 #2
Et lille eksempel.

        private void ButtonClick(object sender, EventArgs e)
        {
            this.treeViewSelected.Nodes.Clear();

            TreeNode rootNode = new TreeNode("Selected Nodes");

            foreach (TreeNode node in this.treeView.Nodes[0].Nodes)
            {
                if (node.Checked)
                {
                    TreeNode newNode = (TreeNode)node.Clone();
                    rootNode.Nodes.Add(newNode);
                }
            }

            this.treeViewSelected.Nodes.Add(rootNode);
        }
Avatar billede woogoo Nybegynder
02. oktober 2006 - 15:22 #3
Det virker sørme! ;)

Men jeg har lige et til! Lad os sige at jeg gør det samme.. krydser af og trykker på en knap.. når jeg trykker på den knap skal den så gå ned i en listBox og skrive de Directory's som jeg har krydset af... Hvordan gør man det? (er forholdsvis ny i dette sprog)
Avatar billede bulgroz Nybegynder
02. oktober 2006 - 16:07 #4
Kort udvidet eksempel...

      private void ButtonClick(object sender, EventArgs e)
        {
            this.treeViewSelected.Nodes.Clear();
            this.listView.Items.Clear();

            TreeNode rootNode = new TreeNode("Selected Nodes");

            foreach (TreeNode node in this.treeView.Nodes[0].Nodes)
            {
                if (node.Checked)
                {
                    TreeNode newNode = (TreeNode)node.Clone();
                    rootNode.Nodes.Add(newNode);

                    ListViewItem listViewItem = new ListViewItem(this.GetTreePath(node));
                    this.listView.Items.Add(listViewItem);
                }
            }

            this.treeViewSelected.Nodes.Add(rootNode);
        }

        private string GetTreePath(TreeNode node)
        {
            TreeNode tempNode = node;
            string value = string.Empty;

            while (tempNode != null)
            {
                value = string.IsNullOrEmpty(value) ? tempNode.Text : string.Format("{0}.{1}", tempNode.Text, value);
                tempNode = tempNode.Parent;
            }

            return value;
        }
Avatar billede woogoo Nybegynder
03. oktober 2006 - 11:50 #5
Hvis nu jeg kun har 1 TreeView og 1 listBox (ikke listView)... hvordan gør jeg så.. for det her kan jeg ikke få til at fungere optimalt!.. og nu når jeg trykker på knappen bliver den ført over og omdøbt til "Selected Nodes".. Den skal hedde det samme som directory'et..! f.eks C:\Programmer\Adobe..... osvosv.. de skal skrives på lister alle de Dir's man vælger!
Avatar billede bulgroz Nybegynder
03. oktober 2006 - 12:39 #6
F.eks. sådan her (små ændringer)


private void ButtonClick(object sender, EventArgs e)
        {
            this.treeViewSelected.Nodes.Clear();
            this.listBox.Items.Clear();

            // TreeNode rootNode = new TreeNode("Selected Nodes");

            foreach (TreeNode node in this.treeView.Nodes[0].Nodes)
            {
                if (node.Checked)
                {
                    TreeNode newNode = (TreeNode)node.Clone();
                    // rootNode.Nodes.Add(newNode);
                    this.treeViewSelected.Nodes.Add(newNode);

                    this.listBox.Items.Add(this.GetTreePath(node));
                }
            }

            // this.treeViewSelected.Nodes.Add(rootNode);
        }
Avatar billede woogoo Nybegynder
03. oktober 2006 - 13:18 #7
Hvis jeg lige retter til osv kommer den med disse 2 fejl!

'DatabaseMover.Form1' does not contain a definition for 'treeViewSelected'
'DatabaseMover.Form1' does not contain a definition for 'GetTreePath'
Avatar billede woogoo Nybegynder
03. oktober 2006 - 13:22 #8
hov!

DatabaseMover.Form1' does not contain a definition for 'GetTreePath' fik jeg fjernet! havde kommet til at slette det andet helt!

men.. treeViewSelected?
Avatar billede bulgroz Nybegynder
03. oktober 2006 - 13:26 #9
Du anvender blot foregående eksempler, og udskifter kun ButtonClick metoden!
Avatar billede woogoo Nybegynder
03. oktober 2006 - 13:29 #10
men den laver stadig fejlen: 'DatabaseMover.Form1' does not contain a definition for 'treeViewSelected' 2 steder!.. ?
Avatar billede bulgroz Nybegynder
03. oktober 2006 - 13:35 #11
Mit eksempel har både et træ som viser selection, samt listBox. Hvis du ikke ønsker træet fjerner du blot den linie kode som fejler.

Hvis du kun vil have en ListBox til at vise selection fjerner du med andre ord linierne:

                  TreeNode newNode = (TreeNode)node.Clone();
                    // rootNode.Nodes.Add(newNode);
                    this.treeViewSelected.Nodes.Add(newNode);
Avatar billede woogoo Nybegynder
03. oktober 2006 - 13:45 #12
Det ser fint nok ud! Nu er der bare 2 små problemer igen..

Jeg kan kun få overført nodes i level 1 og 2.. hvis jeg går længere ned i et dir bliver den ikke flyttet over..

og når jeg flytter over skriver den f.eks: c:\Programmer.spil og ikke c:\Programmer\spil!
Avatar billede bulgroz Nybegynder
03. oktober 2006 - 14:18 #13
Hvorledes stien skrives afhænger af følgende linie:

value = string.IsNullOrEmpty(value) ? tempNode.Text : string.Format("{0}.{1}", tempNode.Text, value);

Du skal med andre ord rette punktummet i teksten "{0}.{1}" til dit ønskede tegn.

Husk min kode er et generelt eksempel som ikke kender til din specifikke løsning.

Og Ja min løsning er begrænset til de omtalte levels. Hvis du ønsker at det skal ske for samtlige noder, må du derfor iterere alle dine childs og sub-childs.
Avatar billede bulgroz Nybegynder
03. oktober 2006 - 14:21 #14
Nb: Din streng vil se dsomfølger :
"{0}\\{1}"
Avatar billede bulgroz Nybegynder
03. oktober 2006 - 14:46 #15
Når man ser bort fra mine tastefejl grundet et dårligt keyboard vil eksemplet se ud som følger:

        private void ButtonClick(object sender, EventArgs e)
        {
            this.treeViewSelected.Nodes.Clear();
            this.listBox.Items.Clear();

            this.AddCheckedItems(this.treeView.Nodes);
        }

        private string GetTreePath(TreeNode node)
        {
            TreeNode tempNode = node;
            string value = string.Empty;

            while (tempNode != null)
            {
                value = string.IsNullOrEmpty(value) ? tempNode.Text : string.Format("{0}\\{1}", tempNode.Text, value);
                tempNode = tempNode.Parent;
            }

            return value;
        }

        private void AddCheckedItems(TreeNodeCollection nodes)
        {
            if (nodes != null)
            {
                foreach (TreeNode node in nodes)
                {
                    if (node.Checked)
                    {
                        this.listBox.Items.Add(this.GetTreePath(node));
                    }

                    this.AddCheckedItems(node.Nodes);
                }
            }
        }
Avatar billede bulgroz Nybegynder
03. oktober 2006 - 17:37 #16
Jeg har misset at TreeNode i sig selv har en property som returnerer den fulde sti med en valgt separator. Eksemplet er herefter således:

        public Form1()
        {
            InitializeComponent();

            this.treeView.PathSeparator = @"\"; // Behøves egentligt ikke da det er default værdien.
        }

        private void ButtonClick(object sender, EventArgs e)
        {
            this.treeViewSelected.Nodes.Clear();
            this.listBox.Items.Clear();

            this.AddCheckedItems(this.treeView.Nodes);
        }

        private void AddCheckedItems(TreeNodeCollection nodes)
        {
            if (nodes != null)
            {
                foreach (TreeNode node in nodes)
                {
                    if (node.Checked)
                    {
                        this.listBox.Items.Add(node.FullPath);
                    }

                    this.AddCheckedItems(node.Nodes);
                }
            }
        }
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