Autor Beitrag
estrella1410
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Mi 17.09.08 13:00 
Also ich habe mal wieder ein Problem mit dem Treeview...

Ich möchte gerne , dass nachdem einige werte im treeview markiert wurden (es sind checkboxen vorhanden wo dann zur auswahl ein haken rein gemacht wird) diese in eine danebenstehende listbox geschrieben werden(inkl. deren unterpunkte)...das schreiben in die listbox oder anders formuliert das füllen dieser soll erfolgen nach dem auf einen button geklickt wurde...

bis jez schreibt er immer nur diesen einen wert hinein der selektiert wurde..weder die unterpunkte noch andere selektierte werte...

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
            TreeNode n = new TreeNode();


            if (treeView1.SelectedNode.Checked == true)
            {
                listBox1.Items.Add(treeView1.SelectedNode.Text);
            }



ich habe schon eine schleife nach der anderen versucht irgendwie drumrum zu bauen damit er alle markierungen übernimmt aber ich weis einfach nicht weiter...kann mir da jemand helfen?

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Moderiert von user profile iconKha: Topic aus Sonstiges (.NET) verschoben am Do 18.09.2008 um 12:46
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 17.09.08 13:33 
Wenn du auch nur einen Wert abfragst, kann ja auch nur einer in die ListBox übernommen werden.

Damit du auch etwas lernst und nicht nur einen Code kopierst, gebe ich dir keinen fertigen Source-Code, aber dafür folgende Hilfe:
Du mußt (rekursiv) alle Knoten (Nodes) des TreeViews durchlaufen und dabei überprüfen, ob für den jeweiligen Knoten der Haken gesetzt ist (Checked).

Schreib erstmal die Schleife für die Knoten der ersten Ebene (in einer eigenen Methode), und teste dies.
Danach erweitere die Methode um den rekursiven Aufruf (der Unterknoten)...
estrella1410 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Do 18.09.08 10:30 
war ein guter tipp...danke ..also die erste schleife, so dass er die ersten elemente in die liste schreibt hab ich hinbekommn bei der 2ten dann hakt es ...er sagt mir wert außerhalb des arraybereichs als ich es in einer do / while schleife verpackt hatte....

ich pack nochmal mei code rein ...

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
            //int a zum durchzählen aller unterknoten eines knotens
            int a = 0;
            //int nummer zur obtischen anordnung aller listenelemente


            TreeNode n1 = new TreeNode();
            TreeNode n2 = new TreeNode();

            //wenn die werte markiert sind werden sie in die listbox geschrieben und anschließend markierung rausgenommen
            for (int i = 0; i < treeViewTeilnehmer.Nodes.Count; i++)
            {

                n1 = treeViewTeilnehmer.Nodes[i];

                //wenn der knoten gechecked ist....
                if (n1.Checked == true)
                {
                    //wenn unterknoten existent
                    if (n2.Text != "")
                    {
                        n2 = treeViewTeilnehmer.Nodes[i].Nodes[a];
                        listBox3.Items.Add(nummer + ". " + n1.Text + " ; " + n2.Text);
                        a++;
                        nummer++;
                        n1.Checked = false;
                    }
                    //wenn es keinen unterknoten gibt wird nur der oberknoten geadded 
                    else
                    {
                        listBox3.Items.Add(nummer + ". " + n1.Text);
                        nummer++;
                        n1.Checked = false;
                    }
                }
                //wenn oberknoten nicht gechecked ist
                else
                {
                    //wenn unterknoten ungleich null und gechecked ist
                    if ((n2.Text != "") && (n2.Checked == true))
                    {
                        listBox3.Items.Add(nummer + ". " + n1.Text + " ; " + n2.Text);
                        nummer++;
                        n1.Checked = false;
                        n2.Checked = false;
                    }
                }
            }
,

bräuchte da nochmal nen tipp :oops:

Moderiert von user profile iconAXMD: Code- durch C#-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 18.09.08 11:55 
Warum suchst du dir als Anfänger gleich so eine komplexe Aufgabe heraus oder ist dies eine Schul- oder Uni-Aufgabe?

Du hast (anscheinend) das Prinzip 'Rekursion' nicht verstanden, s. a. de.wikipedia.org/wiki/Rekursion.

Jeder Knoten eines TreeView besitzt wiederum seine Unterknoten in einer separaten Nodes-Collection.
Du brauchst nur die Schleife einmal schreiben und dann für die Unterknoten (rekursiv) aufrufen.

Eleganter geht es mit einer foreach-Schleife:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
void CopyToListBox(TreeNodeCollection nodes)
{
  foreach(TreeNode node in nodes)
  {
    if(node.Checked)
       listBox.Items.Add(node.Text);

    if(node.Nodes.Count > 0)
       CopyToListBox(node.Nodes); // <- Rekursion
  }
}

Um auch noch die Namen der Oberknoten in die Listbox voran zu schreiben, mußt du (einfach!) den zusammengesetzten Namen als weiteren Parameter der rekursiven Methode mitgeben.

Und wenn du willst, das automatisch alle Unterknoten (un)gecheckt werden, würde ich das mittels TreeView.AfterCheck lösen (auch hier wieder rekursiv alle Unterknoten durchlaufen).

Und wieviele Ebenen hast du denn in deinem Baum (nur 2, oder, denn sonst klappt deine bisherige Funktion nicht)?
estrella1410 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Di 23.09.08 11:12 
Hallo,

ja, richtig, um 2 ebenen...
ich weis, dass das nichts einfaches ist, was ich machen muss und du kannst mir glauben ich würde mich auch lieber langsam auf die dinge hinarbeiten als direkt sowas zu kreieren..aber ich kann es mir nicht aussuchen...

habe es jetzt soweit versucht umzusetzn...es klappt nun alles soweit denke ich ...

DANKE..
SSC streezer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

WinXP, Vista Ultimate
C# (VS 05 n' 08), PHP
BeitragVerfasst: Di 30.09.08 09:22 
ich würde irgendwie was mit select versuchen...

ausblenden C#-Quelltext
1:
2:
if(treeView.selectednode)
  listbox.add(selectednode.text);


ist pseudo code - also nicht beirren lassen ;)

_________________
>> Swiss Soldiers Clan << visit us