C# Problem Treeview

deathhour

Commander
Registriert
Juni 2007
Beiträge
2.571
Hallo,

ich bin gerade dabei mir einen kleinen explorer zu bauen und wollte gerne einen Verlauf darstellen mit einem TREEVIEW oder auch knoten genannt!

Ich habe das Problem das ic hkeine Ahnung habe ob es möglich wäre einen C# befehl zur laufzeit dynamisch festzulegen und ausführen zu können.

Treeview hat das Problem das er immer in diese dymensionen unterteilt ist das kann man an sich nich so richtig dynamisch programmieren.

Ich müsste sonst immer vorgeben wie viele unterknoten es gibt, das is mir zu doof!

Ich hoffe es gibt hier einen richtigen c# freak der mir da einen tipp geben könnte!

Danke schonmal!
 
AW: C# Problem Treeview

das TreeView objekt enthält unter Nodes glaub ich objekte vom Typ TreeNode, jetzt ist die Frage was genau du mit Verlauf meinst (Ordnerstruktur oder eher die Angeklickten Ordner?)



du könntest z.B.

Code:
TreeNode parentNode = treeView1.Nodes.Add(new TreeNode("text"));

machen und dann

Code:
parentNodenode.Nodes.Add(new TreeNode("textVonSubNode1"));
parentNodenode.Nodes.Add(new TreeNode("textVonSubNode2"));
parentNodenode.Nodes.Add(new TreeNode("textVonSubNode3"));

untern Knoten hinzufügen
 
Zuletzt bearbeitet:
AW: C# Problem Treeview

Du kannst doch vor Aufbau des Astes erst die enthaltenen Objekte zählen und diese dann per Variable übergeben. Dann brauchst du nichts händisch eintragen. Falls die Performance bei vielen Ordner zusammenbricht empfiehlt es sich auch erstmal nur die obersten Knoten anzeigen zu lassen und im Hintergrund den Rest nachzuladen. Ob das bei einem Desktoprechner allerdings von Bedeutung ist kann ich nicht sagen.
 
naja mein Problem ist eben das ich händisch 2-3 dimension locker hin kriege!
Aber sobald ich eben mehrer mache hab ich keine ahnung wie ich die nodes anspreche weil ich immer den vorhergehenden knoten als INDEX angeben muss! Damit die hirarchie stimmt!

@ichhalt ^^
DU hast ja recht aber wnen ich den nächsten knoten habe muss ich

treeView1.Nodes.Nodes.Add(new TreeNode("text"));

angeben!
Ich muss immer den vorgängeer angeben auch wenn ich mich in mehrern unterdimensionen befinde! Die lösung wäre denk ich ma wenn ich einen string zusammensetzen könnte um diesen dann ausführen zu können ^^ ,geht in SQL auch xD ob das auch in c# geht ^^??

MMh ich seh gerade du hast diesen parentnode als variable?
DAs sieht ja sehr interessant aus! Das lönnte vt. funktionieren!


könntest du mir evt. ein kleines sample schreiben damit ich sehen kann ob ich das für mich benutzen könnte?


EDIT:So wie du es jetzt hast klick ich auf einen unternode und er erstellt mir wieder den gleichen NODE!
Ich find das übel schwer weil sobald ich ein event ausgelöst habe brauch ich sozusagen den vorgäner und muss dann den nachfolger ran hängen!
 
Zuletzt bearbeitet:
könntest du evtl. mal mehr von deinem Code zeigen, dann könnte man das evtl. besser bewerten :)
 
ok

also


Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace te
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            treeView1.Nodes.Clear();
            TreeNode parentNode = treeView1.Nodes.Add(new TreeNode("huhu").ToString());
            parentNode.Nodes.Add(new TreeNode("textVonSubNode1"));
            parentNode.Nodes.Add(new TreeNode("textVonSubNode2"));
            parentNode.Nodes.Add(new TreeNode("textVonSubNode3"));



        }

        private void Form1_Load(object sender, EventArgs e)
        {
            TreeNode parentNode = treeView1.Nodes.Add(new TreeNode("text").ToString());
            parentNode.Nodes.Add(new TreeNode("textVonSubNode1"));
            parentNode.Nodes.Add(new TreeNode("textVonSubNode2"));
            parentNode.Nodes.Add(new TreeNode("textVonSubNode3"));
        }
    }
}


Ich habs einfahc mal kopert er legt mir einen Node an der heißt "text"!
Ich klicke auf ihn und die erste diemension geht auf mit den anderen 3 Nodes!
Mein problem ist das wenn ich auf die nächste dimension klicke also auf "textVonSubNode1" müsste wieder ein knoten aufgehen mit dem nächsten text! Im meinem fall vom nächsten ordner!


Ich müsste ja theoretisch im SENDER die infos vom vorherrigen knoten haben! Aber ich brauch einen dynamischen befehl der mir egal wieviele diemensionen der ast nach unten geht code generiert!
 
Zuletzt bearbeitet:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace te
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler(treeView1_NodeMouseClick);
        }

        void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
             [B]//hier könntest du mit e.Node auf die angeklickte Node zugreifen[/B]
        }

        [B]TreeNode parentNode;[/B]
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            treeView1.Nodes.Clear();
            parentNode = treeView1.Nodes.Add(new TreeNode("huhu").ToString());
            parentNode.Nodes.Add(new TreeNode("textVonSubNode1"));
            parentNode.Nodes.Add(new TreeNode("textVonSubNode2"));
            parentNode.Nodes.Add(new TreeNode("textVonSubNode3"));



        }

        private void Form1_Load(object sender, EventArgs e)
        {
            parentNode = treeView1.Nodes.Add(new TreeNode("text").ToString());
            parentNode.Nodes.Add(new TreeNode("textVonSubNode1"));
            parentNode.Nodes.Add(new TreeNode("textVonSubNode2"));
            parentNode.Nodes.Add(new TreeNode("textVonSubNode3"));
        }
    }
}

wenn du die parentNode ausserhalb definierst könntest du überall darauf zugreifen

über dieses e.Node kannst du dann z.B.
Code:
e.Node.Nodes.Add(new TreeNode("textVonSubNode:" + e.Node.Text));

weitere Subnodes hinzufügen
 
Zuletzt bearbeitet:
Sieht schonmal gut aus aber wie krieg ich das hin das ich mir

das erspare!

treeview1.Nodes.Nodes[j].Nodes[k].Nodes.Add...

Weste wie ich das meine ich müsste die diemensionen immer per hand anlegen ic hwill die ja zur laufzeit erstellen, ich müsste mir irgendwie einen String bauen können und diesen als Befehl ausführen!


könntest mir vielleicht mal ein lösung sample anbieten ? sprich sobald ich auf den unternode klicke das dann ein weiterer node erstellt wird der unter dem 1.unternode steht?
Wäre lieb!


EDIT:Ja es geht danke! So habe ich mir das vorgestellt! Jedoch welche werte müsste ich ändern um die nächsten noted zu erzeugen! Ich hab ja einen lauf pfad in meinem explorer und der gibt mir die namen der nächsten objekte! Ich müsste irgendwie ne schleife rein bauen!
 
Zuletzt bearbeitet:
siehe Oben :)

es gäbe auch noch die möglichkeit auf die Node über der angeklickten Node mit
Code:
e.Node.Parent
zuzugreifen
 
Zuletzt bearbeitet:
Wenn ich das richtig betrachte



Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace te
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler(treeView1_NodeMouseClick);
        }

        void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {

            e.Node.Nodes.Add(new TreeNode("BLUB"));   YYYY
        }

        TreeNode parentNode;
        private void Form1_Load(object sender, EventArgs e)
        {
            parentNode = treeView1.Nodes.Add(new TreeNode("text").ToString());
            parentNode.Nodes.Add(new TreeNode("textVonSubNode1"));
            parentNode.Nodes.Add(new TreeNode("textVonSubNode2"));
            parentNode.Nodes.Add(new TreeNode("textVonSubNode3"));   XXXX
        }
    }
}
Ich müsste an stelle X Start Knoten Festlegen! Mittels schleife und count meiner ordner
Dann müsste ich bei YYYY wieder eine schleife machen die mir die date im nächsten ordner zählt und dann die nodes bei blub erzeugt mit den jeweiligen texten!


DANKE mann das war die LÖSUNG!^^
 
Freut mich.. viel spaß damit :)

am besten schreib dir ne Methode bei der du die Node und den Pfad übergibst und lässt dir da alles füllen dann haste weniger arbeit
 
du sagst es ! Auf die Art werden mir schön meine unter knoten erstellt! Sag mal mir is aufgefallen das wenn ic hauf den unter knoten drüke erstellt er mir 2 weiter unterknoten mit dem name blub woran kann das liegen==? wir hätten ja eigentlich nur einen?
 
Setz mal nen Haltepunkt bei der NodeMouseClick und kuck wie oft das Aufgerufen wird
 
Ne habs scho geklärt^^
egal ich guck mir das eh noc hma an muss noch paar schelifechen rumwickeln xD aber mein kern prob is geklärt, wenn ich mal fragen dar f was arbeitest du den so?

Such eine Firma o man evtl. auch mal mit c# ein wenig geld verdienen kann xD
 
Auszubildender Fachinformatiker - Anwendungsentwicklung :)
 
Arbeiteste direkt in ner Firma? Codeste da ordentlich c#? Ich muss immer mit Navsion arbeiten :(
 
Jo in nem kleinen Betrieb... un Progge da in C# deshalb kenn ich mich da n wenig aus
 
Aha naja gut danke für die hilfe!
 
Immer wieder gerne
 
1.) Das mit dem Integer Index würde ich sowieso bleiben lassen. Wenn du einen Knoten einfügst, dann kannst du nicht nur einen Wert, sondern auch einen Key übergeben. Dann brauchst du schon einmal nur so zugreifen:
TreeView1.Nodes["C:"].Nodes["Windows"].Nodes["system32"]

2.) Weiters empfiehlt es sich noch für die Abarbeitung eine rekursive Funktion zu schreiben, die einem Knoten einfügt, Knoten zurückgibt usw. Damit erspart man sich viel Arbeit. Dann sagst du gleich nur mehr getNode("C:\Windows\system32")

3.) Kleiner Tipp zu TreeViews: In den meisten Fällen ist es besser, wenn man die Daten erst beim Expanden eines TreeNodes nachlädt, weil eventuell will man den Code dannn einmal recyclen und z.B. dann mit ganzen Laufwerken arbeiten und da ist es doch etwas unperformant, wenn man jedes Mal die ganzen Netzlaufwerke (die vielleicht noch übers Internet mit VPN angebunden sind) durchliest, bis irgendetwas angezeigt wird.

4.) Zu C# an sich kann ich dir nicht viel helfen, da ich fast nur in VB.NET programmiere, aber die Features sind dank .NET Framework fast gleich und nur die Optik ist unterschiedlich, aber hier hast du einmal meine Klasse MyTreeView. Die brauchst du dann nur noch übersetzen:

Code:
Public Class MyTreeView
    Public TreeView As TreeView

    Public Sub New(ByVal TreeView As TreeView)
        Me.TreeView = TreeView
    End Sub

    Public Sub Add(ByVal Dir As String)
        Add(TreeView.Nodes, Dir)
    End Sub

    Private Sub Add(ByVal Nodes As TreeNodeCollection, ByVal Dir As String)
        If Dir.Contains("\") Then
            Dim FirstPart As String = Dir.Substring(0, Dir.IndexOf("\"))
            Dim LastPart As String = Dir.Substring(Dir.IndexOf("\") + 1)

            If Not Nodes.ContainsKey(FirstPart) Then
                Nodes.Add(FirstPart, FirstPart)
            End If

            Add(Nodes(FirstPart).Nodes, LastPart)
        Else
            If Not Nodes.ContainsKey(Dir) Then
                Nodes.Add(Dir, Dir)
            End If
        End If
    End Sub

    Public Function getNode(ByVal Dir As String) As TreeNode
        Return getNode(TreeView.Nodes, Dir)
    End Function

    Private Function getNode(ByVal Nodes As TreeNodeCollection, ByVal Dir As String) As TreeNode
        If Dir.Contains("\") Then
            Dim FirstPart As String = Dir.Substring(0, Dir.IndexOf("\"))
            Dim LastPart As String = Dir.Substring(Dir.IndexOf("\") + 1)

            If Not Nodes.ContainsKey(FirstPart) Then
                Return Nothing
            End If

            Return getNode(Nodes(FirstPart).Nodes, LastPart)
        Else
            If Nodes.ContainsKey(Dir) Then
                Return Nodes(Dir)
            Else
                Return Nothing
            End If
        End If
    End Function

    Public Function containsNode(ByVal Dir As String) As Boolean
        If getNode(Dir) IsNot Nothing Then
            Return False
        Else
            Return True
        End If
    End Function

    Public Sub Clear()
        TreeView.Nodes.Clear()
    End Sub

    Public Shared Function getNodePath(ByVal Node As TreeNode) As String
        Dim CurrentNode As TreeNode = Node
        Dim Parent As TreeNode = CurrentNode.Parent
        Dim Path As String = CurrentNode.Name

        While Parent IsNot Nothing
            Path = String.Format("{0}\{1}", Parent.Name, Path)
            CurrentNode = Parent
            Parent = Parent.Parent
        End While

        Return Path
    End Function
End Class
 
Zurück
Oben