bulldozer2009 Geschrieben 19. Juni 2009 Geschrieben 19. Juni 2009 Hallo, es geht um die Darstellung von Suchergebnissen (Dateipfade) in einem TreeView-Control. Dabei soll das in etwa wie ein Dateiexplorer sein. Die Suchergebnisse untergeordnet darzustellen ist auch kein Problem. Schwierigkeiten macht es Nodes an bereits vorhandenenen Nodes anzuhängen. Das Suchprogramm gibt eine Liste mit Dateipfaden in diesem Format aus: E:\Eigene Dateien\My Music\musik.mp3 E:\Eigene Dateien\My Music\nocheinemusikdatei.mp3 E:\Programme\irgendwas\datei.txt E:\Downloads\doktorarbeit.doc Diese Suchergebnisse möchte ich in einem TreeView darstellen. Das Schwierigste dabei ist, dass beispielsweise nocheinemusikdatei bei My Music mit angehängt wird. Bis jetzt sieht es bei mir so aus: Imageshack - treeview.png Der Code dazu sieht so aus: namespace Baumstruktur { public partial class Form1 : Form { public Form1() { InitializeComponent(); FillTreeView(treeView1, @"E:\Eigene Dateien\Visual Studio 2008\Settings\datei.exe"); FillTreeView(treeView1, @"E:\Eigene Dateien\Visual Studio 2008\Olaf\datei2.exe"); } private void FillTreeNode(TreeNode parentNode, string[] splittedPath, int Level, int MaxLevel, TreeView tvw) { // Wenn der Knoten noch leer ist soll der erste String eingfügt werden if (parentNode.Text == "" && Level == 0) { parentNode.Text = splittedPath[Level]; parentNode.Name = splittedPath[Level]; } TreeNode[] result = tvw.Nodes.Find(parentNode.Text, true); if (result.Length == 0) // Ausführen wenn der Eintrag noch nicht vorhanden ist { if (Level > 0) { TreeNode[] resultPreviousNode = tvw.Nodes.Find(splittedPath[Level - 1], true); if (resultPreviousNode.Length == 0) { TreeNode subNode = new TreeNode(splittedPath[Level]); subNode.Name = splittedPath[Level]; parentNode.Nodes.Add(subNode); if (Level < (MaxLevel - 1)) FillTreeNode(subNode, splittedPath, Level + 1, MaxLevel, tvw); } else { resultPreviousNode[0].Nodes.Add(parentNode); if (Level < (MaxLevel - 1)) { TreeNode subNode = new TreeNode(splittedPath[Level + 1]); FillTreeNode(subNode, splittedPath, Level + 1, MaxLevel, tvw); } } } else { if (Level < (MaxLevel - 1)) FillTreeNode(parentNode, splittedPath, Level + 1, MaxLevel, tvw); } } else { if (Level < (MaxLevel - 1)) if ((Level + 1) == MaxLevel) { FillTreeNode(parentNode, splittedPath, Level + 1, MaxLevel, tvw); } else { parentNode.Name = splittedPath[Level+1]; parentNode.Text = splittedPath[Level+1]; FillTreeNode(parentNode, splittedPath, Level + 1, MaxLevel, tvw); } } } public void FillTreeView(TreeView tvw, string path) { string[] pathSplitted = path.Split('\\'); TreeNode dummy = new TreeNode(); FillTreeNode(dummy, pathSplitted, 0, pathSplitted.Count(), tvw); tvw.Nodes.Add(dummy); } } } Ich bin für jede Hilfe dankbar!! Zitieren
Amstelchen Geschrieben 19. Juni 2009 Geschrieben 19. Juni 2009 Ich bin für jede Hilfe dankbar!! der debugger leistet hier hervorragende hilfe, weil man sieht, was wo geschieht. s'Amstel Zitieren
bulldozer2009 Geschrieben 21. Juni 2009 Autor Geschrieben 21. Juni 2009 Ich habe den Code schon an die 100-mal debuggt. Im Debugger sieht es so aus, als wenn alles genau so passiert wie gewünscht. Tut es aber nicht. Zitieren
streffin Geschrieben 23. Juni 2009 Geschrieben 23. Juni 2009 (bearbeitet) is zwar vb.net und nich c#, aber ajo, dafür funktionierts , und is nicht so grausam if verschachtelt sollte normal ganz gut lesbar und verstehbar sein. Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim test As String Dim test2 As String test = "c:\bla\test.exe" test2 = "c:\blub\test.exe" filltreeview(Me.TreeView1, test) filltreeview(Me.TreeView1, test2) End Sub Sub filltreeview(ByVal treeview As TreeView, ByVal pfad As String) Dim splitted_path() As String splitted_path = pfad.Split("\") Dim nodes() As TreeNode Dim nodeExists As Boolean = False For i As Integer = 0 To splitted_path.Length - 1 For Each node As TreeNode In treeview.Nodes If node.Level = i And node.Text = splitted_path(i) Then nodeExists = True End If Next If Not nodeExists Then 'wenns den node auf der Ebene noch nicht giebt, dann einen erstellen : z.b. "C:" Dim newNode As New TreeNode() newNode.Text = splitted_path(i) newNode.Name = splitted_path(i) If Not i = 0 Then 'sofern wir hier in der Ersten Ebene sind hängen wir den Node 'direkt in die Treeview (siehe unten) nodes = treeview.Nodes.Find(splitted_path(i - 1), True) 'Find() giebt uns hier ein array zurück mit allen Nodes die dem String 'den wir suchen entsprechen For Each n As TreeNode In nodes If n.Level = i - 1 Then 'Jeden Node im Array prüfen ob er sich in der richtigen Ebene befindet, 'sonst kann das den Pfad verfäschen, wenn gefunden, 'unseren neuen Node als childNode reinschieben n.Nodes.Add(newNode) End If Next Else treeview.Nodes.Add(newNode) End If End If nodeExists = False Next End Sub End Class edit : ich habs noch a weng kommentiert. Bearbeitet 23. Juni 2009 von streffin Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.