Laden...

Pfade aus ListView über TreeView lesen

Erstellt von falsecode vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.255 Views
Thema geschlossen
F
falsecode Themenstarter:in
55 Beiträge seit 2013
vor 10 Jahren
Pfade aus ListView über TreeView lesen

Hallo Community,
ich habe da ein Problem mit dem TreeView bzw. ListView und hoffe das Ihr mir vielleicht weiter helfen könnt.

Folgendes in meiner ListView befinden sich ausgewählte Datein die ich in einer anderen ListView anzeigen lasse. Über das TreeView hole ich mir für meine ausgewählten Datein die Pfade. Dabei habe ich das Problem das meine Methode zum Pfade holen sich über die Eigenschaft:
treeView1.SelectedNode.FullPath und listView2.FocusedItem.Text

zum großen Teil falsche Pfade zusammenbastelt.

In meiner Auswahl habe ich z.B. als erstes Objekt dieses hier: C:\Intel\Logs\IntelChipset.log
der Pfad wird richtig angezeigt. Jetzt allerdings wechsel ich im TreeView den Node zu C:\Drivers
dort wähle ich das Objekt INFCACHE.1 aus.

Im Ergebnis erhalte ich in meinem String Array folgende Pfade:
C:\Intel\Logs\IntelChipset.log
C:\Drivers\IntelChipset.log
C:\Drivers\INFACHE.1

Ich weiss das, dass Problem dadurch ensteht das ich die Nodes im TreeView noch aufgeklappt habe auch wenn ich schon in einem anderen unterwegs bin, dadurch verdoppelt sich der Eintrag, später dann natürlich vervierfacht usw. Das Problem lässt sich nicht so einfach lösen, denn ich kann nämlich nicht über das Event treeView1_BeforeExpand, den letzten Node einfach schließen, da ich diesen nicht ermitteln kann, die Childnodes machen eine Zählung unmöglich.

Auch fällt mir kein Algorithmus ein, mit dem ich die falschen Elemente aus dem Array löschen könnte, da sich die falschen Einträge nicht ausfindig machen lassen. Es kommt ja darauf an wie viele Objekte man von einem Node ausgewählt hat und in welcher Reihenfolge, dadurch enstehen die Fehler Spaghetticode mäßig.

Zur verdeutlichung was ich meine, ich wähle aus drei verschiedenen Nodes jeweils ein Objekte aus, das Ergebnis lautet: 1 Pfad richtig, 2 falsch, 3 richtig, 4 falsch, 5 falsch, 6 richtig.
Oder ich wähle aus dem ersten Node ein Objekt und aus dem zweiten Node zwei Objekte, das Ergebnis: 1 Pfad richtig, 2 falsch, 3 richtig, 4 falsch.

Die Anzahl der generierten Pfade ist also auch von der ausgewählten Tiefe des Nodes abhängig.

Es wäre super wenn jemand versuchen würde, das Problem zu verstehen und mir bei einer Lösung behilflich ist.

Anbei stelle ich noch den Code rein.

liebe Grüße
falsecode


foreach (ListViewItem item2 in listView2.Items)
        {        
            string path;
            char[] commaSeparator = new char[] { '|' };
            string sPath = treeView1.SelectedNode.FullPath;
            string sFileName = item2.Text;
            sb2.Append(sPath + "\\" + sFileName + "|");
            path = sb2.ToString();
            Pfade = path.Split(commaSeparator, StringSplitOptions.RemoveEmptyEntries);
            Pfade = Pfade.Distinct().ToArray();
        }

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo falsecode,

wenn du so konfus programmierst, wie du schreibt, dann wundert mich gar nichts mehr. 😃

Im Ernst: Kannst du bitte versuchen, klarer zu beschreiben, was genau du versuchst. Dass muss keineswegs automatisch mehr Text bedeuten. Vielleicht ist hier sogar weniger mehr. Versuche dich dabei in jemanden zu versetzen, der keine Ahnung von dem hat, was du vorhast.

herbivore

R
212 Beiträge seit 2012
vor 10 Jahren

Bitte schreib mal drunter was du meintest.

Mit ["A*"] knüpfe ich an deine vorrangegangene aussage an zb: [A1] = Aussage 1.1 oder 1.2.

Aussage 1.1: Du willst alle aufgeklappten TreeViewNodes auslesen.
Aussage 1.2: Du willst alle selektierten TreeViewNodes auslesen.

Aussage 2: Du willst pfade erstellen, für jedes element dass auf [A1] zutrifft.

Aussage 3: Die zu erstellenden pfade wählst du mit deiner 2.Listviev aus.

Aussage 4: Die erstellen pfade möchtest du in deiner 1.Listviev anzeigen lassen.

F
falsecode Themenstarter:in
55 Beiträge seit 2013
vor 10 Jahren

Ich hatte schon befürchtet das meine Beschreibung nicht so einleuchtend sein könnte.

Zweiter Versuch, nun ich habe eine WinForm auf der sich ein TreeView und zwei ListView befinden. Mein TreeView stellt eine Art Windows Explorer da, es werden Ordner und Verzeichnisse mit Ihren Unterverzeichnissen dargestellt.
Passend dazu werden die jeweiligen Dateien in diesen Ordnern in meiner einen ListView angezeigt. Der Benutzer soll jetzt die Möglichkeit haben aus dieser ListView bestimmte Elemente zu selektieren. Die vom Benutzer makierten Elemente, werden via Button Klick auf meine zweite ListView geklont.

Die erste ListView passt sich ja dem TreeView an, sprich die Items aus der ListView sind davon abhängig welcher Node im TreeView geöffnet ist. Das trifft auf die selektiert/geklonten Items in meiner zweiten ListView aber nicht zu. Daher kann ich die Pfade der Dateien in meiner zweiten ListView bezogen auf den TreeView nicht bestimmen, da möglicherweise der Benutzer andere Nodes vom TreeView aufgeklappt hat.

Es bleibt mir nur eine korrekte Zuweisung des Pfades, wenn sich der TreeView nicht verändert hat. Ansonsten entstehen Überschneidungen, sprich ein geklontes Element wird einmal richtig wiedergegeben und je nachdem wie oft sich die geöffneten Nodes geändert haben.

Einfaches Beispiel:
In meiner ersten ListView selektiere ich das Item, dass dem Pfad C:\Intel\Logs\IntelChipset.log entspricht. Ich gehe im TreeView in einen anderen Node, "Driver". In der ersten ListView werden nun die Dateien aus "Driver" angezeigt ich selektieren/klone die Datei hinter dem Pfad C:\Drivers\INFCACHE.1

Jetzt lasse ich mir mit meiner Methode die Pfade zu den Items aus der zweiten ListView in ein Array schreiben. Ich erhalte folgende drei Pfade:
C:\Intel\Logs\IntelChipset.log
C:\Drivers\IntelChipset.log

C:\Drivers\INFCACHE.1

Nicht gerade weniger Text, aber besser verständlich wie ich finde.

Zu Robin0
Aussage 2 zu Aussage 1.1 stimmt fast, ich will allerdings keine Pfade für irgendwelche Nodes haben sondern, Pfade für Objekte die sich auf die Nodes beziehen. Ich denke das meine neue Beschreibung dir helfen könnte mich zu verstehen.

Danke schonmal das Ihr so freundlich seid und versucht mir zu helfen.

falsecode

709 Beiträge seit 2008
vor 10 Jahren

Hallo falsecode,
verstehe ich das richtig, dass du verhindern möchtest, dass C:\Drivers\IntelChipset.log im 2. ListView erscheint, wenn du einen neuen TreeNode auswählst? Oder wird der Eintrag erst falsch erstellt, wenn du INFCACHE.1 in ListView2 schieben willst?

Gruß
pinki

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo falsecode,

ich sehe das Problem nicht. Wenn sich etwas im TreeView ändert, dann aktualisierst du das erste ListView. Das zweite ListView ist davon überhaupt nicht betroffen. Das ändert sich nur, wenn du im ersten ListView etwas selektierst und in das zweite ListView überträgst. Bei diesem Übertragungsvorhang ist der Pfad, der davorgesetzt werden muss, aber klar: es ist der Pfad dessen Dateien im ersten ListView stehen. Eigentlich müsstest du den aus dem TreeView ermitteln können, denn wenn das TreeView sich schon geändert hätte, wäre auch schon das erste ListView geändert. Wenn das aus irgendwelchen Gründen doch nicht geht, kannst du dir den Pfad aber auch irgendwo merken, immer wenn du das erste ListView aktualisiert. In dem Moment weißt du den Pfad ja auf jeden Fall.

herbivore

F
falsecode Themenstarter:in
55 Beiträge seit 2013
vor 10 Jahren

@pinki
Öh, du bist auf dem richtigen Dampfer. Ich möchte wie du schon schreibst verhindern das dieser: C:\Drivers\IntelChipset.log falsche Pfad entsteht.
Allerdings ist meine ListView korrekt, die ganze Zeit über. Lediglich meine Methode die ich im ersten Beitrag zeigte, schreibt diesen falschen Pfad, das muss ich verhindern.

@ herbivore
Du hast alles richtig erkannt. Ermitteln kann ich ihn allerdings nicht richtig. Das mit den merken ist ein guter Ansatz, allerdings müsste ich mir für alle Items in der ersten ListView bei jeder Aktuallisierung des TreeViwe alle Datensätze merken, wäre noch möglich, nur jetzt kommt der Punkt der mich daran hindert. Wie soll ich dann aus diesen "Pfade-Array", den richtigen Pfad für das richtige Element aus der zweiten ListViwe ermitteln?

R
212 Beiträge seit 2012
vor 10 Jahren

Warum betreibst du soviel aufand, du kanst doch eigentlich einfach das selektierte item aus ListView1 in LV2 kopieren.

Oder direkt vom deinem TreeView in die ListView2.

Du kannst im übrigen den Pfad vom dateinamen trennen indem du folgendes nutzt:

System.IO.Path.GetFileName(string path); //gibt den dateinamen zurück
System.IO.Path.GetDirectoryName(string path); //gibt den pfad zurück

dann kannst du die das Rumgepopel in der foreach sparen.

F
falsecode Themenstarter:in
55 Beiträge seit 2013
vor 10 Jahren

Nicht anderes mache ich mit dem klonen, nur dabei entsteht ja mein Problem mit den falschen Pfaden, herbivore hat es gut zusammengefasst.

Denn Tip nehme ich mir zu Herzen.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo falsecode,

langsam scheint mir doch, dass das ein Problem mit [Hinweis] Wie poste ich richtig? Punkt 1.1.1 ist. Es gibt genug grundlegende Datenstrukturen, mit denen man sich korrespondierende Informationen merken kann. Mal ganz abgesehen davon, dass du nach deiner Beschreibung dafür einfach ListViewItem.Tag verwenden kannst.

herbivore

Thema geschlossen